Javascript:精​​确奇怪的行为

The*_*art 0 javascript jquery

可能重复:
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会显示这样的行为?

T.J*_*der 6

因为浮点不是很精确.你最终可能会略有不同.

(附注:我认为你的意思var x = .6 - .5;,否则,你就比较-0.10.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浮点要慢.

让我们输出你的xy值:

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使用相同数量的地方运行,最终应该是相同的数字(即使这个数字不完全准确).