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