美文网首页
Float.parseFloat()的坑

Float.parseFloat()的坑

作者: sys_out | 来源:发表于2019-01-10 23:44 被阅读75次

今天遇到一个奇怪的问题。抓包看到后台给的数据是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()的坑

    今天遇到一个奇怪的问题。抓包看到后台给的数据是330371.39,然而app页面上展示的是330371.38。de...

  • 四舍五入

    //四舍五入 float f = Float.parseFloat(chargingPile.getScore()...

  • 坑说

    大坑小坑,皆是坑; 深坑浅坑,都能坑; 能不被坑,别被坑; 休要日日想被坑。 关于坑古来有之,最近的就是坑爹,远的...

  • 白童话 | 标题待定

    日更占坑日更占坑日更占坑日更占坑日更占坑日更占坑日更占坑日更占坑日更占坑日更占坑日更占坑日更占坑日更占坑日更占坑日...

  • 2018-02-08

    坑爹,坑娘。还没见过坑儿子的

  • WebView上传文件无响应的问题:

    坑,坑,坑,坑,坑,坑;注意事项:做完这些可能调用系统相册是没有问题的,但是如果自己写的一个选择图片的页面,我们通...

  • 小马啊小马

    马化腾坑写手,马云坑消费者,马明哲坑全家,马蓉坑老公,马俊仁坑田径,马航坑乘客,马谡坑诸葛亮,马夫人坑乔峰,马伯庸...

  • 汽车坑 | 贷款买车坑不少 你被坑了吗?

    本文转载自公众号“汽车坑”(ID:qichekeng),“汽车坑,大坑小坑,和坑主一起入坑出坑” 今天,坑主有一朋...

  • 奇太公钓鱼,愿者入坑~

    PS:圈坑、壁坑、抽坑......

  • 画画练习 | 画画练习 #63

    还在加班,占个坑,还在加班,占个坑,还在加班,占个坑,还在加班,占个坑,还在加班,占个坑,还在加班,占个坑,还在加...

网友评论

      本文标题:Float.parseFloat()的坑

      本文链接:https://www.haomeiwen.com/subject/svazrqtx.html