Java的Math.round的舍入规则是否符合IEEE 754标准?

问题描述 投票:0回答:1

我从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 标准,对吗?

java math rounding ieee-754
1个回答
1
投票

您是正确的,

Math.round
没有实现 IEEE-754 中描述的任何舍入模式。这些是 IEEE-754-2008 中定义的:

  1. TiesToEven,也称为银行四舍五入(
    2.5 -> 2
    1.5 -> 2
    ),由
    Math.rint
  2. 实现
  3. TowardZero,也称为
    trunc
    ,在 Java 中通过强制转换为 int 或 long
  4. 来实现
  5. TowardPositive,由
    Math.ceil
  6. 实施
  7. TowardNegative,由
    Math.floor
  8. 实施
  9. TiesToAway,从零舍入 x.5。该模式没有Java功能,但可以实现为
    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 只描述操作,而不描述名称),并省略其中一些,因为它们只是“应该”和“应该”的要求。

可能弹出的相关问题:

© www.soinside.com 2019 - 2024. All rights reserved.