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:根据@自