Numberクラス 小数の計算とか四捨五入、切り上げ、切り捨て

8進数・10進数・16進数

8進数・10進数・16進数をリテラル表す時のメモ

16進数は0xを付けて表記するので10進数と間違える事はないと思う。8進数は0始まりの数値で表すので10進数と違うことを意識しておかないとね。特に先頭を0埋めした文字列を数値に変換する時とか。。。

var num1 = 0377;		//  8進数 255
var num2 = 255; 		// 10進数 255
var num3 = 0xFF; 		// 16進数 255
console.log(num1);		// 255
console.log(num2);		// 255
console.log(num3);		// 255

小数の計算

よく言われている事だけど小数の計算は、浮動小数点なので誤差が生じる。 誤差を出さないようにするには、すべての小数リテラルに対して必要な精度までの掛け算をし割り戻す等の手間が必要。

var num4 = 0.1 + 0.1 + 0.1;	
var num5 = (0.1*10 + 0.1*10 + 0.1*10) / 10;  
console.log(num4) 	// 0.30000000000000004
console.log(num5) 	// 0.3

これでOKと思いきや、実はこの場合も0.1*10という計算を行っている。

例えば0.29 に100を掛けた場合、こんな風に誤差が生じる。

var num6 = (0.29 * 100);
console.log(num6);			// 28.999999999999996

結局のところちゃんと小数の計算を行う必要がある時は、ライブラリ等を活用するしかないんですね^^;
実際の所、JavaScriptでそこまで求められる事は少ないと思うけれど、過信は禁物( ー`дー´)キリッ
ライブラリの種類も色々あって、Qiita JSの数値計算ライブラリ比較まとめ で紹介している。これは参考になりそう。

そのうち、標準装備になる事を祈る

四捨五入、切り上げ、切り捨て

JavaScriptの四捨五入、切り上げ、切り捨ては整数にする場合と桁指定する場合でちょっとやり方が異なる
整数にする場合はMathオブジェクトのround(四捨五入)、ceil(切り上げ)、floor(切り捨て)で可能。
桁指定する時は、先程の小数の計算の時のように予め必要精度を確保してから割り戻す工夫が必要

// 四捨五入、切り上げ、切り捨てで整数にする場合
var num7 = Math.round(12.5);	// 四捨五入	
var num8 = Math.ceil(12.1);		// 切り上げ
var num9 = Math.floor(0.29);	// 切り捨て
console.log(num7); 				// 13
console.log(num8); 				// 13
console.log(num9); 				// 12

// 四捨五入、切り上げ、切り捨てで桁指定にする場合(少数1桁にする場合の例)
var num10 = Math.round	(1.25*10)/10;		// 四捨五入	
var num11 = Math.ceil	(1.21*10)/10;		// 切り上げ
var num12 = Math.floor	(1.21*10)/10;		// 切り捨て
console.log(num10) 	// 1.3
console.log(num11) 	// 1.3
console.log(num12) 	// 1.2

この場合も先程の計算誤差と一緒で、思いもよらない結果になる事がある。

var num13 = Math.ceil	(0.28*100)/100;		// 切り上げ
console.log(num13) 		// 0.29

これはキツイね~やっぱりライブラリ必須かなぁ。。。