String.Format和Float中的“Bug”

时间:2014-10-30 18:54:45

标签: android string format

我有一个将float转换为字符串的代码

total  = quant * valUnit;

lb_total.setText(String.format(Locale.US,"%.2f", total));

if total = 56.025(7.5 * 7.47) > 56.02

if total = 71.025(7.5 * 9.47) > 71.03

为什么第一个没有完成?

我找到了解决问题的方法,我创建了一个正确的类。

import java.lang.Math;

// iniF   = value to be rounded
// posIni = number of max houses(EX: 7.45 * 7.999, max houses for this operation is five)
// posFin = number of houses after rounded
// EX: xx*.xxxxx -> xx*.xx    posIni = 5, posFin = 2
public class MyMath {
    public Float MyRound(Float iniF, int posIni, int posFin){
        Float result     = 0.00f;
        int resultTmp    = 0;
        int nCasas       = (int) Math.pow(10, posIni - 1);
        Float arredondaF = iniF * nCasas;

        for(int p = posIni; p > posFin; p--){
            resultTmp  = Math.round(arredondaF);
            arredondaF = (float) resultTmp / 10;
        }

        result = arredondaF / 10;

        return result;
    }
}

1 个答案:

答案 0 :(得分:1)

由于内部精度差异,特别是因为这些数字是浮点运算的结果。在内部,56.025实际上类似56.024999999871.025类似于71.025000000002。由于二进制/十进制转换和值的位分辨率,浮点运算在计算机中并不精确,数学上精确。

以下是来自Ruby的示例:

irb(main):003:0> format("%.2f", 7.5 * 7.47)
=> "56.02"
irb(main):004:0> format("%.2f", 7.5 * 9.47)
=> "71.03"

在这里,我使用了更高的格式精度,你可以看到值的真正含义:

irb(main):007:0> format("%.15f", 7.5 * 9.47)
=> "71.025000000000006"
irb(main):008:0> format("%.15f", 7.5 * 7.47)
=> "56.024999999999999"

stackoverflow.com上有很多关于此问题的帖子,有各种形式。只需进行表格搜索"浮点精度"或者"浮点精确"。