在 JavaScript 中,数字被定义为 64 位 double 。我有一个分布式 Web 应用程序的特定用途,它只有在我可以依赖所有浏览器的一致结果时才有效。
尽管规范使用 IEEE 标准,但我自然会怀疑数学库甚至底层硬件的实现可能存在微小差异,这可能会导致复合错误。
是否有任何兼容性数据来源或可靠的测试套件来验证浏览器中的 double 计算?特别是,我还需要考虑移动浏览器(通常基于 ARM)。
澄清 -
这是一个关于浏览器兼容性的问题。我试图了解是否可以依赖所有浏览器以可靠、一致和可重复的方式处理数字,如为 IEEE 浮点定义的那样。在大多数语言中,这是一个安全的假设,但有趣的是,浏览器中对此存在一些不确定性。
关于如何避免由于缺乏精度和舍入误差而导致的浮点问题,有一些很好的建议。在大多数情况下,如果您需要准确性,则应遵循此建议!
对于这个问题,我不是想避免这个问题,而是理解它。浮点数在设计上本质上是不准确的,但只要对构建的方式加以注意,这种不准确是完全可以预测和一致的。 IEEE-754 对此进行了详细描述,只有标准机构才能做到。
如果有人可以引用,我决定提供一点赏金,
在这个问题中,我不是在寻找替代选项、解决方法或避免问题的方法。感谢您的建议。
最佳答案
(编辑:下面提到的错误已于 2016 年 3 月 3 日修复。所以我现在的答案是“可能”。)
不幸的是,答案是否定的。 v8 中至少有一个突出的错误,由于双舍入,这意味着它可能与 32 位 Linux 上的 IEEE 754 double 不匹配。
这可以通过以下方式进行测试:
9007199254740994 + 0.99999 === 9007199254740994
我可以验证这在 32 位 Ubuntu 上运行的 Chrome 26.0.1410.63 上失败(左侧是
9007199254740996
)。它在同一系统上通过 Firefox 20.0。至少,这个测试应该添加到你的测试套件中,也许 test262。
关于javascript - 跨浏览器Javascript数字精度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9389315/