Java浮点自动舍入问题
我有一个简单的方法来计算等价物,但我遇到了一个问题,它似乎是不必要的四舍五入 当我通过99.002时,它应该返回类似于9920.040080160的值 99.002/(100–99.002)x 100 但由于某种原因,它四舍五入到小数点后三位。它似乎与参数速率的小数位数相匹配Java浮点自动舍入问题,java,Java,我有一个简单的方法来计算等价物,但我遇到了一个问题,它似乎是不必要的四舍五入 当我通过99.002时,它应该返回类似于9920.040080160的值 99.002/(100–99.002)x 100 但由于某种原因,它四舍五入到小数点后三位。它似乎与参数速率的小数位数相匹配 public float calculateEquivalentRate(float rate){ if(rate==100) { return 0.000F; }
public float calculateEquivalentRate(float rate){
if(rate==100) {
return 0.000F;
}
return rate / (100 - rate) * 100;
}
知道如何停止舍入吗?浮动精度有限。如果不够的话,你可以换双打。如果这还不够,你可以使用任意精度的东西,比如BigDecimal 从float切换到double似乎可以为您提供所需的精度:
double rate = 99.002;
System.out.println(rate / (100-rate) * 100);
输出:
9920.040080160274
浮动精度有限。如果不够的话,你可以换双打。如果这还不够,你可以使用任意精度的东西,比如BigDecimal 从float切换到double似乎可以为您提供所需的精度:
double rate = 99.002;
System.out.println(rate / (100-rate) * 100);
输出:
9920.040080160274
浮动精度有限。如果不够的话,你可以换双打。如果这还不够,你可以使用任意精度的东西,比如BigDecimal;没有可精确表示的十进制结果-必须有一些舍入,或者您必须使用有理数(分数)“它应该返回类似于9920.040080160的值”因为
float
只有一个,所以float
不可能存储这样的数字,它有13位有效的小数精度。浮点的精度有限。如果不够的话,你可以换双打。如果这还不够,你可以使用任意精度的东西,比如BigDecimal;没有可精确表示的十进制结果-必须有一些舍入,或者必须使用有理数(分数)“它应该返回类似于9920.04008160的值”因为浮点
只有一个,所以浮点
不可能存储这样的数字,它有13个精度有效的十进制数字。