我试图找出为什么我在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
神奇地工作,但我不想增加它,而是希望它包含我以后可以使用的数字。我有什么东西在这里失踪吗?请解释一下。
答案 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;
// ...
}