为什么Math.round返回一个长,但Math.floor返回一个双精度?
为什么不一致?
没有不一致之处:这些方法只是设计为遵循不同的规范。
long round(double a)
long
double floor(double a)
double
双升云台比较(双a)
double rint(double a)
double
因此,通过设计,舍入为 a,舍入为 .自 JDK 1.0 以来一直都是如此。round
long
rint
double
在JDK 1.2中添加了其他方法(例如,);其他的在1.5中添加(例如,,,等),还有一些是在1.6中添加的(例如,,,等)(在文档中查找自:元数据);但是,从一开始,他们就一直以现在的方式拥有彼此。toRadians
toDegrees
log10
ulp
signum
copySign
getExponent
nextUp
round
rint
可以说,也许而不是和,命名它们和会更“一致”,但这是有争议的。也就是说,如果你坚持直截了当地称之为“不一致”,那么原因可能就像“因为它是不可避免的”一样令人不满意。long round
double rint
double round
long rlong
以下是《有效 Java 第 2 版》第 40 项:仔细设计方法签名中的一段话:
如有疑问,请向 Java 库 API 寻求指导。虽然有很多不一致的地方 - 考虑到这些库的规模和范围,这是不可避免的 - 但也存在相当多的共识。
floor
将被选中以匹配math.h中的标准c例程(在另一个答案中提到,也存在于该库中,并返回一个,如java中所示)。rint
double
但当时在c中不是标准函数(C89中没有提到它 - c标识符和标准;c99确实定义了,并且它返回一个,如你所料)。语言设计师“借用”想法是正常的,所以也许它来自其他语言?fortran 77没有这个名字的功能,我不确定当时还有什么可以用作参考。也许vb - 这确实有,但不幸的是,对于这个理论,它返回一个(php太)。有趣的是,perl故意避免定义圆形。round
round
double
Round
double
[更新:嗯,看起来像smalltalk返回整数。我对smalltalk的了解不够,不知道这是正确和/或通用的,并且该方法被称为,但它可能是源。smalltalk确实在某些方面影响了java(尽管在概念上比细节上更多)。rounded
如果它不是 smalltalk,那么我们就会得到一个假设,即有人只是选择得很差(考虑到 java 中可能存在的隐式转换,在我看来,返回 a 会更有用,因为这样,它可以在转换类型和进行浮点计算时使用)。double
换句话说:java和c通用的函数往往与当时的c库标准一致;其余的似乎是任意的,但这种特殊的皱纹可能来自小话。