Javascript:圆形数字不加起来(33.3 + 33.3 + 33.3 = 99.89999999999999?)

时间:2015-01-27 02:36:05

标签: javascript floating-point numbers integer

考虑将这个javascript舍入到最接近的十分之一,然后将这些数字合计在一起。



var log = function(key, value) {
  var li = document.createElement("li");
  li.appendChild(document.createTextNode(key + " = " + value)); 
  document.getElementById("results").appendChild(li); 
  };

var number1 = Math.round(10*33.333)/10; // gives 33.3
var number2 = Math.round(10*33.333)/10; // gives 33.3
var number3 = Math.round(10*33.333)/10; // gives 33.3

var totalOfAllNumbers = number1 + number2 + number3; //gives 99.89999999999999?

var totalOfAllRealNumbers = 33.3 + 33.3 + 33.3; //gives 99.9?

log("number1", number1);
log("number2", number2);
log("number3", number3);
log("totalOfAllNumbers", totalOfAllNumbers);

<ul id="results"></ul>
&#13;
&#13;
&#13;

数字似乎是四舍五入的,但总数不能达到99.9?为什么呢?

手动输入的数字33.3与分割结果有什么区别?它们是不同的类型吗?

1 个答案:

答案 0 :(得分:0)

我讨厌给出一个轻率的回复,但它给出了舍入错误号“因为JavaScript”。

稍微不那么轻率的回答是引擎试图猜测(如ECMA规范所述)添加的每一步的类型以及类型猜测算法中的某个地方,它猜测它是一个双重而不是浮点(或副)反之亦然)当你看到这种类型的精度损失时。如果数值准确性对您至关重要,我建议使用不同的编程语言,使用更安全,更可预测的数字类型。

编辑:

例如考虑python 2.7:

>>> a = round(10*33.333, 2)/10
>>> b = round(10*33.333, 2)/10
>>> c = round(10*33.333, 2)/10
>>> a + b + c
99.999

或红宝石:

2.1.2 :001 > a = (10*33.333).round(2)/10
 => 33.333
2.1.2 :002 > b = (10*33.333).round(2)/10
 => 33.333
2.1.2 :003 > c = (10*33.333).round(2)/10
 => 33.333
2.1.2 :004 > a + b + c
 => 99.999