Math.round和String.format函数不能为所有浮点值正确舍入

时间:2019-02-05 07:58:43

标签: java android floating-point rounding

我尝试了 Math.round String.format 函数来舍入浮点/双精度值。

1)使用Math.round函数

npm install async --save

对于floatValue 40.55,结果为40.6 //正确且符合预期的结果。

对于floatValue 30.05,结果为30.0 //错误的结果。预期结果:30.1

2)使用String.format函数

Math.round(floatValue* 10.0) / 10.0;

对于floatValue 40.55,结果为40.6 //正确和预期的结果。

对于floatValue 59.65,结果为59.6 //错误的结果。预期结果:59.7

为什么相同的函数对于不同的float值表现不同。

1 个答案:

答案 0 :(得分:0)

In可以通过可视化

    float fv = 30.05f;
    System.out.println((fv));
    System.out.println((fv * 10.0));
    System.out.println(Math.round(fv * 10.0));
    System.out.println(Math.round(fv * 10.0) / 10.0);

结果

30.05
300.49999237060547
300
30.0

您可以看到30.05实际上存储为30.49999237060547,这就是为什么它出现四舍五入的原因。请在评论中查看@EricPostpischi更为简洁的解释。

请参见https://rules.sonarsource.com/java/tag/misra/RSPEC-1244

What's wrong with using == to compare floats in Java?