为什么Java和Javascript Math.round(-1.5)为-1?

时间:2016-04-12 11:12:29

标签: javascript java rounding negative-number

今天我发现了Java和Javascript的Math.round函数的这种行为。

使(1.40)为1以及(-1.40)为-1

它使(1.60)到2以及(-1.60)到-2

现在,它使(1.5)变为2。 但是,将(-1.5)设为-1。

我在PhP和MySQL的圆形等效中检查了这种行为。 两者都得到了预期的结果。即圆(-1.5)至-2

即使Math.round definition说它应该将它四舍五入到最接近的整数。

想知道为什么会这样?

3 个答案:

答案 0 :(得分:2)

舍入模式向负无穷大舍入。如果结果为正,则表现为RoundingMode。DOWN;如果是否定的,则表现为RoundingMode。UP。请注意,此舍入模式永远不会增加计算值。 这只是整数的问题,它与数字图表的位置有关。从here,您可以看到javadocs

public static int round(float a)

返回与参数最接近的int,并将关系向上舍入。

Special cases:
  • 如果参数为NaN,则结果为0.
  • 如果参数为负无穷大或任何小于或等于Integer.MIN_VALUE的值,则结果等于Integer.MIN_VALUE的值。
  • 如果参数为正无穷大或任何大于或等于Integer.MAX_VALUE的值,则结果等于Integer.MAX_VALUE的值。

    参数:

a - 要舍入为整数的浮点值。

Returns:

参数的值四舍五入到最接近的int值。 查看此link too

答案 1 :(得分:1)

来自Ecma script documentation

  

返回最接近x并且等于a的Number值   数学整数。如果两个整数Number值相等   到x,那么结果是更接近+∞的Number值。如果是x   已经是整数,结果是x。

其中x是传递给Math.round()的数字。

因此Math.round(1.5)将返回2,因此2与...相比更接近+∞。同样Math.round(-1.5)将返回-1,因此-1与-2相比更接近+∞。

答案 2 :(得分:0)

问题是1和1.5以及1.5和2之间的距离完全相同(0.5)。现在有几种不同的方法可以解决:

  • 始终朝着正无限
  • 总是朝着负无穷大
  • 始终为零
  • 总是远离零
  • ...(见Wikipedia

显然,Java和JS都选择了第一个(这并不罕见)。