为什么Math.ceil返回双精度值?


75

当我打电话Math.ceil(5.2)回是double 6.0。我的天生的倾向是认为那Math.ceil(double a)会返回long。从文档中:

ceil(double a)

返回double不小于参数且等于数学整数的最小(最接近负无穷大)值。

但是,如果结果是整数,为什么要返回adouble而不是a long?我认为了解其背后的原因可能会帮助我更好地理解Java。这也可能帮助我弄清楚是否会因强制转换为而使自己陷入困境long,例如is

long b = (long)Math.ceil(a);

我一直认为应该是什么?我担心可能会出现一些边界问题。


Answers:


70

的范围double大于的范围long。例如:

double x = Long.MAX_VALUE;
x = x * 1000;
x = Math.ceil(x);

如果Math.ceil返回,您希望最后一行做long什么?

请注意,在非常大的值(正数或负数)下,数字最终分布得非常稀疏-因此,如果您明白我的意思,那么大于整数的下一个整数x将不会x + 1是。


我想在您的最后一句话中,您谈论的是精度的宽松,但是我认为这不取决于数字的高位数,而是取决于数字的有效位数(以二进制表示)。我将尝试查找示例。
2011年

@ user270349:连续的双精度值之间的绝对差距随着该值变大而变大。所表示的有效数字位数保持不变(次普通数字除外)。
乔恩·斯基特

2
示例:2^60可以表示为double,而2^60 (+/-) 1不能表示为
aalku 2011年

你是对的。如果指数很大(很明显),则尾数增加1意味着数字更大。
2011年

6
但是为什么还要round返回一个long
佐尔坦

14

两倍可以大于Long.MAX_VALUE。如果调用Math.ceil()这样的值,则期望返回相同的值。但是,如果返回long,则该值将不正确。


double大于的值Long.MAX_VALUE可能无法准确表示,因此的double结果ceil(big_double)将不是big_double + 1。因此,它仍然是不正确的……
CiprianTomoiagă17年

@CiprianTomoiaga,您说对了,不会是big_double +1,因为它是big_double。任何太大而不能表示为a的值long都没有小数部分。
彼得·劳瑞
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.