为什么 Java 和 Java 脚本 Math.round(-1.5) 到 -1?

Why does Java and Javascript Math.round(-1.5) to -1?

今天我弄清楚了 Java 和 Java 脚本的 Math.round 函数的这种行为。

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

它使 (1.60) 变为 2 以及 (-1.60) 变为 -2

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

我也在 PhP 和 MySQL 的回合等效项中检查了此行为。 两者都给出了预期的结果。即 round(-1.5) 到 -2

甚至 Math.round definition 也说它应该四舍五入到最接近的整数。

想知道为什么会这样吗?

向负无穷大舍入的舍入模式。如果结果为正,则与 RoundingMode 的行为相同。DOWN;如果为负,则表现与 RoundingMode.UP 相同。请注意,这种舍入模式永远不会增加计算值。 这只是整数及其在数字图表中的位置的问题。从here可以看到javadocs.

public static int round(float a)

Returns 最接近参数的整数,四舍五入。

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

    参数:

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

Returns:

参数的值四舍五入为最接近的 int 值。 评论此 link too

问题是1和1.5之间的距离以及1.5和2之间的距离完全相同(0.5)。您现在可以通过几种不同的方式四舍五入:

  • 总是朝向正无穷大
  • 总是朝向负无穷大
  • 总是趋向于零
  • 永远远离零
  • 朝向最近的奇数或偶数
  • ...(参见 Wikipedia

显然,Java 和 JS 都选择了第一个(这并不罕见),而 PHP 和 MySql 从零开始四舍五入。

来自Ecma script documentation,

Returns the Number value that is closest to x and is equal to a mathematical integer. If two integer Number values are equally close to x, then the result is the Number value that is closer to +∞. If x is already an integer, the result is x.

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

所以Math.round(1.5)将return 2因此2与1相比更接近+∞。类似地Math.round(-1.5)将return-1因此-1更接近+∞ 与-2 比较。