私はここで何かを逃しているに違いないと知っています。私は成功しないで2桁の数字に任意の量を丸めようとしています。このjsfiddleまたはコードでJavascriptの丸数字は、合計で2つを合計すると失敗しますか?
var sumOne = 0;
var sumTwo = 0;
[12.993, 12.99, 12.99].forEach(function(number){
sumOne += roundOne(number * 0.1);
sumTwo += roundTwo(number * 0.1);
})
function roundOne(n){
return (Math.round((n *100))/100);
}
function roundTwo(n){
return +(n.toFixed(2));
}
console.log("sumOne is ", sumOne, " sumTwo is ", sumTwo);
https://jsfiddle.net/m90ecdh9/1/
私はなぜ、丸めのこれらのメソッドの両方が2つだけ小数点以下との和をもたらすことができないん次の出力
sumOne is 3.9000000000000004 sumTwo is 3.9000000000000004
で終わるの上?
奇妙なことに、配列内の2つの数字だけでこの同じコードを試した場合、私の結果は、両方の方法で小数点以下2桁の合計で期待どおりになります。
浮動小数点の丸め誤差が発生しています。これは珍しいことではありません。絶対に避ける必要がある場合は、変数に整数型を使用させます。 – IvanSanchez
* roundOne *関数は冗長な括弧を持っています: 'return Math.round(n * 100)/ 100;'が行います。名前は小数点以下2桁まで四捨五入されているので不適切です。 – RobG
参照:[230/100 * 100が230を返さないのはなぜですか?](http://stackoverflow.com/questions/13248173/why-does-230-100100-not-return-230/13248284#13248284)と浮動小数点数学は壊れていますか?*](http://stackoverflow.com/questions/588004/is-floating-point-math-broken) – RobG