在Java中将双精度数转换为整数

144
在Java中,我想将一个双精度数转换为整数,我知道可以通过以下方式实现:
double x = 1.5;
int y = (int)x;

如果你这样做,就会得到y=1:

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

你可能会得到2。然而,我在想:由于整数的双精度表示有时看起来像1.9999999998或其他类似的数字,是否有可能通过将 Math.round() 创建的 double 转换为 int 仍然会导致被截断的数字,而不是我们要找的四舍五入的数字(例如:在代码中表示为1而不是2)?

(是的,我的意思是这样:是否存在任何x的值,使得y将显示x的被截断而不是四舍五入的表示的结果?)

如果是这样:是否有更好的方法将double转换为四舍五入的int,而不会冒险截断?


想通了一些事情:Math.round(x)返回一个long而不是double。因此, Math.round() 不可能返回看起来像3.9999998的数字。因此,int(Math.round())永远不需要截断任何内容,总是有效的。


7
Math.round(double) 返回一个 long 类型的值,而不是 double 类型的值。 - qbert220
3个回答

111

如果使用 Math.round() 创建一个 double 类型的值,是否有可能进行转换后,结果仍然是截断的数字?

不会。 round() 方法会将 double 值四舍五入到正确的值,然后将其强制转换为 long 类型,这将截断所有小数部分。但是,在四舍五入之后,不会保留任何小数部分。

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

返回最接近参数的 long 值。结果通过添加 1/2、取 floor 并将结果转换为 long 类型来对整数四舍五入。换句话说,结果等于以下表达式的值:

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

3
重要的一点是四舍五入是在round方法内完成的。该方法返回一个long值,可以安全地转换为int(假设返回值始终在int范围内)。 - qbert220
是的。无法想象将long转换为int会出现问题。显然!我应该想到这一点:( - vdMandele
1
虽然由于四舍五入而不会发生截断,但由于从非常大的双精度数[max double: 1.7976931348623157E308]转换为远远小于它的整型[max int: 2147483647],您仍然可能无法得到预期的结果。这只是需要记在心里的一些事情。 - Nelda.techspiress

43
对于将数据类型 Double 转换为 int,您可以使用以下方法:
Double double = 5.00;

int integer = double.intValue();

这个函数会截断(向下取整),而不是四舍五入。使用时请自行承担风险。

他正在寻找一个四舍五入的值。 - user207421
8
我认为这不会给你期望中的 4.99999999999(只会得到 4 而不是 5)。 - murkle
我的代码显示“double 无法被解除引用”。 - laur34
2
这将截断(向下取整),而不是四舍五入。使用时请自行决定风险。 - Charlie

23
Double perValue = 96.57;
int roundVal= (int) Math.round(perValue);

达成了我的目的。


非常好!谢谢!成功了! - Roboman Robo

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接