Java程序错误:可能会丢失精度

时间:2016-12-08 23:50:21

标签: java compiler-errors

我试图找出为什么我在Java程序中出现这种精度错误的错误。

这是错误:

error: possible loss of precision
         int digit = num/Math.pow(10,i-1)%10;
                                         ^
  required: int
  found:    double
1 error

这是for循环中的代码片段

for(int i = 1; i<=String.valueOf(num).length(); i++)
{
    int digit = num/Math.pow(10,i-1)%10;
    //etc
}

我想将数字保持为整数变量,我试图在循环外声明数字,我也尝试将其转换为一个不起作用的整数。我确实尝试过这样做:

digit += num/Math.pow(10,i-1)%10; //with digit declare outside of loop

神奇地工作,但我不想增加它,而是希望它包含我以后可以使用的数字。我有什么东西在这里失踪吗?请解释一下。

3 个答案:

答案 0 :(得分:3)

我尝试按如下方式运行您的代码:

int digit = (int) (num/Math.pow(10,i-1)%10);

它按预期工作,即它遍历变量num的数字(我假设为int)。

当你使用+ =运算符时,它不是因为魔法,而是因为自动类型提升。您可以在此处详细了解:http://docs.oracle.com/javase/specs/jls/se7/html/jls-5.html

答案 1 :(得分:0)

简单的解决方法是简单地施放

num/Math.pow(10,i-1)%10; 

进入整数。您可以通过在它之前添加(int)来完成此操作:

 int digit = (int) num/Math.pow(10,i-1)%10;

至于为什么会发生这种情况:Math.pow被定义为double并且不会将Double值转换为Integer值而不会明确告诉它。

答案 2 :(得分:0)

Math.pow返回一个double,表达式中的所有其他操作数都是整数类型。要修复编译器错误,请将Math.pow的结果显式转换为int,如其他答案所示。

旁注。不要使用Math.pow来找到10的i-1的幂,因为浮点求幂是不必要的昂贵。相反,在每次迭代时乘以10,如下所示:

int r = 1;
for(int i = 1; r < num; i++, r *= 10) {
    int digit = num / r % 10;
    // ...
}