根据this帖子,JavaScript中的浮点数不是确定性的。
我想知道,下面的代码是确定性的吗?
z = Math.floor(x/y)
如果没有,如何在 JavaScript 中进行确定性整数除法?
编辑:我想知道我是否可以相信不同 JavaScript 实现的结果值是相同的(假设它们遵循标准)。
它应该是确定性的。
根据规格
20.2.2.16 数学.floor ( x )
返回不大于x且等于数学整数的最大(最接近+∞)数值。如果 x 已经是整数,则结果为 x。
- 如果 x 为 NaN,则结果为 NaN。
- 如果 x 为 +0,则结果为 +0。
- 如果 x 为 -0,则结果为 -0。
- 如果 x 为 +∞,则结果为 +∞。
- 如果 x 为 −∞,则结果为 −∞。
- 如果 x 大于 0 但小于 1,则结果为 +0。
注意 Math.floor(x) 的值与 -Math.ceil(-x) 的值相同。
某些数学函数的非确定性与底层引擎使用更高精度数字时可能出现的舍入问题有关。这不应该是这里的一个因素。
更新:
除法是也是确定性的。这里JS规范依赖于IEEE 754规范。但该规范是确定性的。 (抱歉没有链接,因为实际规格是付费的。)
非确定性存在于不太常见的 JS 函数中。
是的。 Math.floor 始终返回最低的 integer 值。
虽然这不是确定性的:
z = 3/1.5; //z !== 2
根据函数的设计,这是:
z = Math.floor(3/1.5); //z === 2
请参阅 MDN 文档了解更多详细信息。