为什么Math.round返回一个长,但Math.floor返回一个双精度?

2022-09-01 02:12:07

为什么不一致?


答案 1

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

因此,通过设计,舍入为 a,舍入为 .自 JDK 1.0 以来一直都是如此。roundlongrintdouble

在JDK 1.2中添加了其他方法(例如,);其他的在1.5中添加(例如,,,等),还有一些是在1.6中添加的(例如,,,等)(在文档中查找自:元数据);但是,从一开始,他们就一直以现在的方式拥有彼此。toRadianstoDegreeslog10ulpsignumcopySigngetExponentnextUproundrint

可以说,也许而不是和,命名它们和会更“一致”,但这是有争议的。也就是说,如果你坚持直截了当地称之为“不一致”,那么原因可能就像“因为它是不可避免的”一样令人不满意。long rounddouble rintdouble roundlong rlong

以下是《有效 Java 第 2 版》第 40 项:仔细设计方法签名中的一段话:

如有疑问,请向 Java 库 API 寻求指导。虽然有很多不一致的地方 - 考虑到这些库的规模和范围,这是不可避免的 - 但也存在相当多的共识。

远距离相关的问题


答案 2

floor将被选中以匹配math.h中的标准c例程(在另一个答案中提到,也存在于该库中,并返回一个,如java中所示)。rintdouble

但当时在c中不是标准函数(C89中没有提到它 - c标识符和标准;c99确实定义了,并且它返回一个,如你所料)。语言设计师“借用”想法是正常的,所以也许它来自其他语言?fortran 77没有这个名字的功能,我不确定当时还有什么可以用作参考。也许vb - 这确实有,但不幸的是,对于这个理论,它返回一个(php太)。有趣的是,perl故意避免定义圆形roundrounddoubleRounddouble

[更新:嗯,看起来像smalltalk返回整数。我对smalltalk的了解不够,不知道这是正确和/或通用的,并且该方法被称为,但它可能是源。smalltalk确实在某些方面影响了java(尽管在概念上比细节上更多)。rounded

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

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