Float.parseFloat()的坑

今天遇到一个奇怪的问题。抓包看到后台给的数据是330371.39,然而app页面上展示的是330371.38。debug了一下,发现数据bean的值就是330371.38。这个字段是用float来接收的。

这就很奇怪了。
image.png

第一次遇到这种事情。用String去接这个字段值就没问题。好吧,对于想省事的我就用String去接吧。but,我在改好之后重新运行了,还是330371.38,这到底是哪里问题?我debug一下,看到String接收到的值就是正确的呀?再往下看有个Float.parseFloat()。嗯。。问题就在这里。不过以前也没遇到过呀。然后我试试运行了下面的代码
public class TestMain {
    public static void main(String[] args) {
        String var1 = "330371.39";
        double var2 = 330371.39;
        float var3 = (float) var2;
        String var4 = "330371.39f";
        String var5 = "30371.39f";
        String var6 = "303715555.39";

        System.out.println("var1_Float.parseFloat(var1): " + Float.parseFloat(var1));
        System.out.println("var1_Double.parseDouble(var1): " + Double.parseDouble(var1));
        System.out.println("var6_Double.parseDouble(var6): " + Double.parseDouble(var6));
        System.out.println("var6_new BigDecimal(var6): " + new BigDecimal(var6).toString());
        System.out.println("var2: " + var2);
        System.out.println("var3: " + var3);
        System.out.println("var4: " + Float.parseFloat(var4));
        System.out.println("var5: " + Float.parseFloat(var5));
    }
}

得到的结果是

var1_Float.parseFloat(var1): 330371.38
var1_Double.parseDouble(var1): 330371.39
var6_Double.parseDouble(var6): 3.0371555539E8
var6_new BigDecimal(var6): 303715555.39
var2: 330371.39
var3: 330371.38
var4: 330371.38
var5: 30371.39

好吧,我这算是Float.parseFloat()的bug?按理说float的精度是


image.png

尾数位每四位可代表一个小数 因为9是1001(小数不就是0.1 - 0.9吗),并且前面0可以省略,所以可以精确的表示的是(23+1)/4 = 6位。而指数位就更多了 最大可表示2^128次方。所以精度上完全够。但是转换错误,难道不是bug?

在附个double类型的


image.png

最后建议如果不涉及计算,String 100%准确。如果设计计算 小的数据double来接收,很小的可以用float。较大数据用String然后转为BigDecimal计算。当然完全都可以用最后一种,不考虑占用内存和网络的话(其实也没啥必要考虑)。

你可能感兴趣的:(Float.parseFloat()的坑)