可能重复:
JavaScript的数学是否被破坏?
假设,
var x = .6 - .5;
var y = 10.2 – 10.1;
var z = .2 - .1;
Run Code Online (Sandbox Code Playgroud)
比较结果
x == y; // false
x == .1; // false
y == .1; // false
Run Code Online (Sandbox Code Playgroud)
但
z == .1; // true
Run Code Online (Sandbox Code Playgroud)
为什么Javascript会显示这样的行为?
因为浮点不是很精确.你最终可能会略有不同.
(附注:我认为你的意思var x = .6 - .5;,否则,你就比较-0.1有0.1.)
JavaScript使用IEEE-754双精度64位浮点(ref).这是一个非常好的浮点数近似值,但没有完美的方法来表示二进制中的所有浮点数.
有些差异比其他差异更容易看到.例如:
console.log(0.1 + 0.2); // "0.30000000000000004"
Run Code Online (Sandbox Code Playgroud)
有一些JavaScript库可以执行"十进制"事件a'la C#的decimal类型或Java BigDecimal.这就是数字实际存储为一系列十进制数字的位置.但它们并不是灵丹妙药,它们只是有一类不同的问题(例如,试着1 / 3准确地用它来表示)."十进制"类型/库对于金融应用程序来说非常棒,因为我们习惯于处理财务方面所需的舍入方式,但是它们的成本往往比IEEE浮点要慢.
让我们输出你的x和y值:
var x = .6 - .5;
console.log(x); // "0.09999999999999998"
var y = 10.2 - 10.1;
console.log(y); // "0.09999999999999964"
Run Code Online (Sandbox Code Playgroud)
没有巨大的惊喜那0.09999999999999998就是!=到0.09999999999999964.:-)
您可以合理化这些以使比较工作:
function roundTwoPlaces(num) {
return Math.round(num * 100) / 100;
}
var x = roundTwoPlaces(0.6 - 0.5);
var y = roundTwoPlaces(10.2 - 10.1);
console.log(x); // "0.1"
console.log(y); // "0.1"
console.log(x === y); // "true"
Run Code Online (Sandbox Code Playgroud)
或者更通用的解决方案:
function round(num, places) {
var mult = Math.pow(10, places);
return Math.round(num * mult) / mult;
}
Run Code Online (Sandbox Code Playgroud)
请注意,精确度crud仍然可能在结果数字中,但至少有两个非常非常非常接近的数字,如果round使用相同数量的地方运行,最终应该是相同的数字(即使这个数字不完全准确).