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

我试图弄清楚为什么我的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 

它神奇地工作,但我不想增加它,而是我希望它包含我可以用于以后的数字。 这里有什么我想念的吗? 请解释。

我试着按如下方式运行你的代码:

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

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

当你使用+ =运算符时,它不是因为魔法,而是因为自动类型提升。 你可以在这里阅读更多相关信息: http : //docs.oracle.com/javase/specs/jls/se7/html/jls-5.html

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

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

变成整数。 你可以通过在它之前添加(int)来做到这一点:

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

至于为什么会发生这种情况:Math.pow被定义为double,并且不会在没有明确告知它的情况下将Double值转换为Integer值。

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; // ... }