Auto rounding

Hamar kellett JS-ben olyan rounding, ami a hasznos digit-ek alapján kerekít a kimenet olvashatóságának javításáért. Mindenhol ilyet használok, csak más nyelveken. Mivel állandóan értékeket kell olvasni, ezért nem mindegy, hogy ránézésre mennyire gyors az értelmezés.

Ez Livescript kód, amit JS-re konvertálok.

round = ( x, ndigit = 3 ) ->
    n = Math.round( Math.log10( Math.abs( x )))
    n2 = ndigit - 1 - n
    n2 = 0  if n2 < 0
    res = parseInt( x * 10**n2 ) / 10**n2
    return res

Kimenetek:

0.00001234567 => 0.0000123

12.34567 => 12.3

12345.67 => 12345

Ha valakinek hasznos, akkor használjátok egészséggel.

 

Szerk.: Javascript verzió bővítve típus vizsgálattal:

function myround( x, ndigit = 3 ) {
	var res = x;
	if ( Number.isFinite( x )) {
		if ( x == 0 ){
			res = 0;
		} else {
			var n = Math.round( Math.log10( Math.abs( x )));
			var n2 = ndigit - 1 - n;
			if ( n2 < 0 ){  n2 = 0;  }
			var x2 = Math.pow( 10, n2 );
			res = parseInt( x * x2 ) / x2;
		}
	}
	return res;
}

Hozzászólások

12345.67 => 12300? (hulyen hangzik, elsore, de ugye ez 123*10^2 kene hogy legyen, mert minden szamot olyanna konvertalsz lenyegeben hogy ABC*10^N)

Igenigen, csak ugye az eleg vicces tud lenni mikor valahol (cikkekben, muszaki leirasokban, stb) megadjak azt hogy valami biszbasz erteke +/- hibaja az nem mas mint 127683.4278 +/- 892.1139. Ez teljesen egyenerteku azzal mintha azt mondanad hogy, "hat, ez kabe szazhuszonhetezer-hatszaz, pluszminusz kilencszaz" :] 

Igen is es nem is, mert technikailag az atlag es az atlag varhato szorasa fuggetlenek. Viszonylag nehez megmondani, hogy a kerekitest pontosan hol kellene megtenni a szorason belul (egy vagy ket szigma, esetleg 0.001 szigma). Maskor meg nincs szoras sem, akkor tenyleg csak a kb. nyeses marad. De reszben emiatt a kerdes miatt irom a cikket, amirol beszeltunk (talan szilveszterkor), mert valahol mindig kerekiteni kell, aminek hatasa van a regressziora, es igy erdemes ra optimalizalni.

Érdemes lehet tudni, hogy a 0.1 kettes számrándszerben nem ábrázolható pontosan, tehát round(0.1,ndigit=1)*10-1 sem feltétlenül lesz nulla.

Igen, ez sajnos ilyen. Erre van például Ruby-ban a "BigDecimal" osztály, mely tetszőleges pontosságú aritmetika 10-es számrendszerben, lásd az oldal elején a pontosság összehasonlítást:

https://ruby-doc.org/stdlib/libdoc/bigdecimal/rdoc/BigDecimal.html