Java浮点自动舍入问题

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

我有一个简单的方法来计算等价物,但我遇到了一个问题,它似乎是不必要的四舍五入

当我通过99.002时,它应该返回类似于9920.040080160的值

99.002/(100–99.002)x 100

但由于某种原因,它四舍五入到小数点后三位。它似乎与参数速率的小数位数相匹配

  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个精度有效的十进制数字。