我从wiki上阅读了IEEE754舍入规则:https://en.wikipedia.org/wiki/IEEE_754#Rounding_rules
有一个例子:在“到最近,远离零”模式下,−12.5 应该是 -13.0
但是 java Math.round(-12.5)==-12.0.
我确信 Math.round 不使用“到最近,与偶数相关”模式,因为 Math.round(-11.5)==-11.0
实际上,在 Java 文档中,它说“返回最接近参数的 long,并且四舍五入到正无穷大。”
那么,Java Math.round 不符合 IEEE 754 标准,对吗?
您是正确的,
Math.round
没有实现 IEEE-754 中描述的任何舍入模式。这些是 IEEE-754-2008 中定义的:
2.5 -> 2
、1.5 -> 2
),由 Math.rint
trunc
,在 Java 中通过强制转换为 int 或 longMath.ceil
Math.floor
Math.copySign(Math.round(Math.abs(x)), x)
从描述中,人们可能会认为
Math.round
是TowardPositive,但这被明确定义为“[…]最接近且不低于无限精确结果”的结果。 Math.round
显然不是这种情况,例如Math.round(2.3) == 2
如果 IEEE-754 要定义
Math.round
,它将被称为类似 TiesTowardPositive 的名称,但这在标准中不存在。
所以,是的,
Math.round
不是 IEEE-754 舍入模式之一,也不同于 C/C++ 的 round
、C# 的 Math.Round
或 SQL 的 ROUND
。
我无法告诉你这个选择的原因。当然,Java 可以自由定义额外的舍入函数,为所有舍入函数选择任意名称(IEEE-754 只描述操作,而不描述名称),并省略其中一些,因为它们只是“应该”和“应该”的要求。
可能弹出的相关问题: