Java 为什么Math.round返回一个long而Math.floor返回一个double?

Java 为什么Math.round返回一个long而Math.floor返回一个double?,java,math,Java,Math,为什么不一致?没有不一致之处:这些方法只是为了遵循不同的规范而设计的 返回与参数最接近的long 返回小于或等于参数且等于数学整数的最大值(最接近正无穷大)double 比照 返回与参数值最接近且等于数学整数的double值 因此,通过设计舍入舍入为长和打印舍入为双。自JDK1.0以来一直如此 JDK1.2中添加了其他方法(例如,toRadians,toDegrees);在1.5中添加了其他内容(例如log10,ulp,signum,等等),但在1.6中添加了更多内容(例如

为什么不一致?

没有不一致之处:这些方法只是为了遵循不同的规范而设计的

    • 返回与参数最接近的
      long
    • 返回小于或等于参数且等于数学整数的最大值(最接近正无穷大)
      double
    • 比照
    • 返回与参数值最接近且等于数学整数的
      double
因此,通过设计
舍入
舍入为
打印
舍入为
。自JDK1.0以来一直如此

JDK1.2中添加了其他方法(例如,
toRadians
toDegrees
);在1.5中添加了其他内容(例如
log10
ulp
signum
,等等),但在1.6中添加了更多内容(例如
copySign
getExponent
nextUp
,等等)(在文档中查找因为:元数据);但是从一开始,
round
rint
就一直像现在这样彼此相爱

可以说,也许将它们命名为
双圆
长轮
会更“一致”,而不是
长轮
长轮
,但这是有争议的。也就是说,如果你坚持把这称为“不一致”,那么原因可能和“因为这是不可避免的”一样令人不满意

这里引用了《有效Java第二版》第40项:仔细设计方法签名:

如果有疑问,请参阅Java库API以获得指导。尽管存在大量的不一致——鉴于这些库的规模和范围,这是不可避免的——但也有相当多的共识

远亲问题

我同意,
Math.round(double)
返回
long
是很奇怪的。如果将大的
double
值强制转换为
long
(这是
Math.round
隐式执行的操作),则返回
long.MAX\u值。另一种方法是使用
Math.rint()
来避免这种情况。但是,
Math.rint()
有一种奇怪的舍入行为:通过舍入到偶数整数来解决关系,即4.5向下舍入到4.0,但5.5向上舍入到6.0)。另一种选择是使用
Math.floor(x+0.5)
。但是请注意,1.5四舍五入为2,而-1.5四舍五入为-1,而不是-2。另一种选择是使用
Math.round
,但前提是该数字在Long.MIN_值和Long.MAX_值之间。此范围之外的双精度浮点值无论如何都是整数


不幸的是,不知道为什么
Math.round()
返回
long
。有人做出了这个决定,他可能从未接受过采访来告诉我们原因。我的猜测是,Math.round的设计目的是提供一种更好的方法(即四舍五入)将双精度转换为长精度。

floor
本应选择与中的标准c例程相匹配(
rint
,在另一个答案中提到,也存在于该库中,并返回一个
double
,如java中所示)

但是
round
在当时不是c语言中的标准函数(C89-中没有提到它;c99确实定义了
round
,并且它返回了一个
双精度
,正如您所期望的那样)。语言设计师“借用”想法是很正常的,所以它可能来自其他语言?fortran 77没有这样一个名称的函数,我不确定当时还会用什么作为参考。也许vb-它确实有
,但不幸的是,对于这个理论,它返回了一个
双精度
(php也是)。有趣的是,perl

[更新:hmmm.看起来像。我对smalltalk了解不够,不知道这是否正确和/或一般,该方法称为
舍入法
,但它可能是源代码。(虽然概念上比细节上更详细)。]

如果不是smalltalk,那么我们只能假设有人选择得很差(考虑到java中可能存在的隐式转换,在我看来,返回一个
double
会更有用,因为它可以在转换类型和进行浮点计算时使用)


换句话说:java和c通用的函数往往与当时的c库标准一致;其余的似乎都是武断的,但这条特殊的皱纹可能来自smalltalk。

和这里的其他人一样,我也不知道答案,但我想有人可能会发现这很有用。我注意到,如果您想在不强制转换的情况下将double四舍五入为int,则可以同时使用两个回合实现
long round(double)
int round(float)

double d = something;
int i = Math.round(Math.round(d));

+1.观察得不错。好奇的人想知道:)考虑到早期基础库的组合方式,这很可能是一个历史性的意外,因为有太多的遗留依赖关系,无法改变。如果是这样的话,这个问题的答案很可能也会被时间的沙子所遗忘。-1这个论点是无效的。如果他们指定
floor()
应返回一个double,而
ceil()
应返回一个int,这是否“一致”?@NullUserException:
floor
ceil
密切相关。有
round
rint
。我不知道你还想要什么。我试图客观地回答这个问题,进一步的猜测似乎是假设的和/或主观的。很公平。。。看起来仍然是这样的。
.rint()
方法是后来添加的,以解决不一致性。@NullUserException:根据
@自