舍入一个double将其转换为int(java)

Dav*_*vid 110 java double int rounding

现在我正在尝试这个:

int a = round(n);
Run Code Online (Sandbox Code Playgroud)

这里n是一个double,但它不工作.我究竟做错了什么?

Mih*_*ria 223

round()代码段中方法的返回类型是什么?

如果这是Math.round()方法,则当输入参数为Double时返回Long.

因此,您必须转换返回值:

int a = (int) Math.round(doubleVar);
Run Code Online (Sandbox Code Playgroud)

  • 考虑使用 Math.toIntExact(long) 而不是仅仅转换为 int;double 可以包含相当大范围的值,如果 double 比您预期的要大,您可能不想默默地丢弃最重要的位。 (3认同)

Dr.*_*mes 26

如果你不喜欢Math.round(),你也可以使用这个简单的方法:

int a = (int) (doubleVar + 0.5);
Run Code Online (Sandbox Code Playgroud)

  • 显然没有不喜欢`Math.round()的有价值的理由`:http://stackoverflow.com/a/6468757/1715716 (4认同)
  • @AlbertoHormazabal,你没注意到他加了"0.5"吗? (4认同)
  • 这个解决方案更短,不需要导入,只需很少的更改就可以移植到许多其他编程语言中.它甚至可能更快,具体取决于您的平台:/sf/ask/846371011/ -integer-IN/12091343#12091343 (3认同)
  • 我不是在批评你的答案,出于你提到的原因,我发现它**非常有用**。通过此评论,我是在向那些害怕使用“Math.round()”的人讲话,它的“字面意思”与您提供的解决方案相同,仅此而已。干杯。 (2认同)
  • 是的,就像nehz所说的那样,我相信这会例如将-2.1舍入为-1。 (2认同)
  • 我想知道为什么在过去的 6 年里没有人写到“Math.round()”的替换对于负输入数字给出了错误的结果。好的,就是:不要更换! (2认同)

val*_*dak 11

double舍入为"最接近"的整数,如下所示:

1.4 - > 1

1.6 - > 2

-2.1 - > -2

-1.3 - > -1

-1.5 - > -2

private int round(double d){
    double dAbs = Math.abs(d);
    int i = (int) dAbs;
    double result = dAbs - (double) i;
    if(result<0.5){
        return d<0 ? -i : i;            
    }else{
        return d<0 ? -(i+1) : i+1;          
    }
}
Run Code Online (Sandbox Code Playgroud)

您可以根据需要更改条件(结果<0.5).


小智 5

Math.round 函数被重载 当它接收到一个浮点值时,它会给你一个 int。例如,这会起作用。

int a=Math.round(1.7f);
Run Code Online (Sandbox Code Playgroud)

当它收到一个 double 值时,它会给你一个 long,因此你必须将它的类型转换为 int。

int a=(int)Math.round(1.7);
Run Code Online (Sandbox Code Playgroud)

这样做是为了防止精度损失。您的 double 值是 64 位,但是您的 int 变量只能存储 32 位,因此它只是将其转换为 long,即 64 位,但您可以将其类型转换为 32 位,如上所述。