在Java中将double转换为整数


114

在Java中,我想将双精度型转换为整数,我知道您是否这样做:

double x = 1.5;
int y = (int)x;

您得到y = 1。如果您这样做:

int y = (int)Math.round(x);

您可能会得到2。但是,我想知道:由于整数的双精度表示有时看起来像1.9999999998或类似的东西,因此通过Math.round()创建的双精度转换是否仍然会导致截断的向下数字,而不是比我们要寻找的舍入数(即:1而不是所示代码中的2)?

(是的,我确实是这样说的:x 是否有任何值,其中y将显示结果被截断而不是四舍五入的x表示?)

如果是这样:是否有更好的方法可以将双精度型转换为舍入型整数而不冒被截断的风险?


找到了一些东西:Math.round(x)返回一个long,而不是double。因此:Math.round()无法返回看起来像3.9999998的数字。因此,int(Math.round())无需截断任何内容,并且始终可以工作。


6
Math.round(double)返回一个long,而不是double。
qbert220 2011年

Answers:


95

是否有可能铸造通过创建的双精度孔Math.round()仍将导致截短的倒数

不,round()将始终将您的double取整到正确的值,然后将其强制转换为long,以截断任何小数位。但是在四舍五入后,将没有剩余的小数部分。

以下是来自的文档Math.round(double)

返回最接近参数的long。通过将结果加1/2,将结果取底,并将结果强制转换为long类型,将结果舍入为整数。换句话说,结果等于表达式的值:

(long)Math.floor(a + 0.5d)

3
重要的一点是,舍入是在舍入方法内完成的。返回一个long值,可以安全地将其强制转换为int(假设返回值始终在int范围内)。
qbert220 2011年

是。无法想象/ long /会给问题。明显!应该已经知道了:(
vdMandele 2011年

1
虽然确实由于舍入而不会发生截断,但由于仅将double从很大的整数[max double: 1.7976931348623157E308]转换为要小得多的int ,您仍然可能无法获得预期的结果[max int: 2147483647]。只是要记住一点。
Nelda.techspiress

22

对于数据类型Doubleint,你可以使用以下命令:

Double double = 5.00;

int integer = double.intValue();

他正在寻找一个四舍五入的价值。
洛恩侯爵,

1
我认为这不会满足您对4.99999999999的期望(会给4而不是5)
murkle

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.