javascript - 跨浏览器Javascript数字精度

标签 javascript numbers

在 JavaScript 中,数字被定义为 64 位 double 。我有一个分布式 Web 应用程序的特定用途,它只有在我可以依赖所有浏览器的一致结果时才有效。

尽管规范使用 IEEE 标准,但我自然会怀疑数学库甚至底层硬件的实现可能存在微小差异,这可能会导致复合错误。

是否有任何兼容性数据来源或可靠的测试套件来验证浏览器中的 double 计算?特别是,我还需要考虑移动浏览器(通常基于 ARM)。

澄清 -

这是一个关于浏览器兼容性的问题。我试图了解是否可以依赖所有浏览器以可靠、一致和可重复的方式处理数字,如为 IEEE 浮点定义的那样。在大多数语言中,这是一个安全的假设,但有趣的是,浏览器中对此存在一些不确定性。

关于如何避免由于缺乏精度和舍入误差而导致的浮点问题,有一些很好的建议。在大多数情况下,如果您需要准确性,则应遵循此建议!

对于这个问题,我不是想避免这个问题,而是理解它。浮点数在设计上本质上是不准确的,但只要对构建的方式加以注意,这种不准确是完全可以预测和一致的。 IEEE-754 对此进行了详细描述,只有标准机构才能做到。

如果有人可以引用,我决定提供一点赏金,

  • 与主流浏览器中 IEEE 数字实现相关的真正兼容性数据。
  • 一个测试套件,旨在验证浏览器中的实现,包括验证 64 位浮点数(53 位尾数)的正确内部使用。

  • 在这个问题中,我不是在寻找替代选项、解决方法或避免问题的方法。感谢您的建议。

    最佳答案

    (编辑:下面提到的错误已于 2016 年 3 月 3 日修复。所以我现在的答案是“可能”。)

    不幸的是,答案是否定的。 v8 中至少有一个突出的错误,由于双舍入,这意味着它可能与 32 位 Linux 上的 IEEE 754 double 不匹配。

  • v8 bug entry
  • Firefox bug entry - fixed in 2009
  • More info on the double-rounding issue

  • 这可以通过以下方式进行测试:
    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/

    相关文章:

    javascript - 计算图像的点击偏移量

    Javascript 将链接的键值分组到数组中

    javascript - 我可以检索当前的 anchor 位置吗?

    javascript - 使用 CSS 动态地为表中的替代行设置 bgcolor

    algorithm - 优化算术表达式序列的快速算法

    mysql - MySQL 是否支持数字或数字通配符模式?

    Android Java.Lang Locale Number Format I/O 不对称问题

    javascript - 使用jquery获取div的底值

    找到最小 N 的算法,使得 N!可以被素数的幂整除

    Java程序打印出可被其他数字整除的数字