Math.floor(x / y)是确定性的吗?

时间:2019-02-22 20:56:21

标签: javascript integer-division deterministic

根据this帖子,JavaScript中的浮点数不是确定性的。

我想知道,以下代码是确定性的吗?

z = Math.floor(x/y)

如果没有,如何在JavaScript中进行确定性整数除法?

编辑:我想知道我是否可以依靠不同JavaScript实现中的结果值相同(只要它们遵循标准)。

2 个答案:

答案 0 :(得分:1)

它应该是确定性的。

根据the specification

  

20.2.2.16 Math.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)的值相同。

某些数学函数的不确定性与底层引擎使用高精度数字时可能的舍入问题有关。这不应该是一个因素。

更新

除法为also deterministic。此处的JS规范取决于IEEE 754规范。但是该规范是确定性的。 (抱歉,没有链接,因为实际的规格是付费的。)

非确定性代码位于不太常见的JS函数中。

答案 1 :(得分:-1)

是的。 Math.floor始终返回最低的整数值。

这不是确定性的: z = 3/1.5; //z !== 2

根据函数的设计,它是: z = Math.floor(3/1.5); //z === 2

有关更多详细信息,请参见the MDN docs