我一直在用Java进行编码,最近开始使用javascript(准确地说是node.js)进行编码。让我发疯的一件事是对十进制数字的加法运算;
考虑以下代码
var a=0.1, b=0.2, c=0.3;
var op1 = (a+b)+c;
var op2 = (b+c)+a;
令我惊讶的是我发现了
op1 != op2
! console.logging op1和op2打印出以下内容:console.log(op1); 0.6000000000000001
console.log(op2); 0.6
这根本不符合逻辑。对我来说,这似乎是一个错误,因为javascript根本无法忽略算术规则。有人可以解释为什么会这样吗?
最佳答案
这是浮点错误的情况。
唯一可以用浮点数精确表示的小数是可以写为整数且分母为2的幂的小数。
例如,可以精确地表示0.5,因为可以将其写为1/2。 0.3不能。
在这种情况下,您的变量和表达式中的舍入错误会在第一种情况下正确组合,但在第二种情况下不会产生错误。
两种方法都无法在幕后精确显示,但是在输出值时,会将其舍入为16位精度。在一种情况下,将其舍入到一个稍大的数字,在另一种情况下,将其舍入到期望值。
您应该学习的教训是,您永远不要依赖具有确切值的浮点数,尤其是在进行一些算术运算之后。