在java中将double转换为整数

vdM*_*ele 109 java double casting rounding

在Java中,我想将double转换为整数,我知道如果你这样做:

double x = 1.5;
int y = (int)x;
Run Code Online (Sandbox Code Playgroud)

你得到y = 1.如果你这样做:

int y = (int)Math.round(x);
Run Code Online (Sandbox Code Playgroud)

你可能会得到2.但是,我想知道:因为整数的双重表示有时看起来像1.9999999998或其他东西,是否有可能通过Math.round()创建一个双重表示仍然会导致截断的数字,而不是比我们正在寻找的舍入数字(即代码中代码为1而不是2)?

(是的,我的意思是这样的:x 是否有任何值,其中y将显示一个截断的结果而不是x的圆形表示?)

如果是这样的话:有没有更好的方法将double变为圆形int而不会有截断的风险?


想象一下:Math.round(x)返回一个long,而不是double.因此:Math.round()不可能返回一个看起来像3.9999998的数字.因此,int(Math.round())将永远不需要截断任何内容并始终有效.

jjn*_*guy 91

是否有可能投射双重创建的通道Math.round()仍然会导致截断的数字

不,round()将始终将您的double舍入到正确的值,然后,它将被转换为long将截断任何小数位的值.但在四舍五入后,将不会有任何小数部分.

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

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

(long)Math.floor(a + 0.5d)
Run Code Online (Sandbox Code Playgroud)

  • 重要的是,舍入是在圆方法内完成的.返回一个long值,可以安全地转换为int(假设返回值始终在int范围内). (3认同)

Cha*_*lie 22

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

Double double = 5.00;

int integer = double.intValue();
Run Code Online (Sandbox Code Playgroud)

  • 我认为这不会给出您所期望的 4.99999999999 (会给出 4 而不是 5) (3认同)
  • 这会截断(地板),并且不会舍入。使用风险自负。 (2认同)

Nan*_*khe 9

Double perValue = 96.57;
int roundVal= (int) Math.round(perValue);
Run Code Online (Sandbox Code Playgroud)

解决了我的目的.