gpt4 book ai didi

Javascript:精​​确的奇怪行为

转载 作者:行者123 更新时间:2023-11-28 12:43:22 25 4
gpt4 key购买 nike

Possible Duplicate:
Is JavaScript's Math broken?

假设,

var x = .6 - .5;

var y = 10.2 – 10.1;

var z = .2 - .1;

比较结果

x == y;     // false

x == .1; // false

y == .1; // false

但是

z == .1;    // true

为什么 Javascript 会表现出这样的行为?

最佳答案

因为 float 并不完全精确。最终可能会出现轻微差异。

(旁注:我认为您的意思是 var x = .6 - .5; 否则,您将 -0.10.1 进行比较.)

JavaScript 使用 IEEE-754 double 64 位浮点 ( ref )。这是 float 非常好的近似值,但是没有完美的方法来用二进制表示所有 float 。

有些差异比其他差异更容易看出。例如:

console.log(0.1 + 0.2); // "0.30000000000000004"

有一些 JavaScript 库可以像 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"

毫不奇怪,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"

或者更通用的解决方案:

function round(num, places) {
var mult = Math.pow(10, places);
return Math.round(num * mult) / mult;
}

Live example | source

请注意,结果数字中仍然有可能出现精度粗略的情况,但如果使用相同的数字进行round,则至少有两个数字彼此非常、非常、非常接近的地点,最终应该是相同的数字(即使该数字并不完全准确)。

关于Javascript:精​​确的奇怪行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10562441/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com