码迷,mamicode.com
首页 > 编程语言 > 详细

Java 浮点数相加

时间:2018-12-14 13:57:00      阅读:258      评论:0      收藏:0      [点我收藏+]

标签:不能   bsp   sdn   博客   hang   原理   小数   解决   rgs   

  刚刚遇到个需求,需要对金额求和,上线的时候才知道这时个,这个字段是个小数。

  随手就改了个Double ,然后,跑下,没啥问题,直接上线了

  然后,就fuck 了

  加出一大堆的小数,大概是这样的

 

package com.venn.demo;

public class DoublePlus {

    public static void main(String[] args) {
        double d1 = 0.01;
        double d2 = 0.01;

        for (int i=0; i< 10; i++){
            d2 += d1;
            System.out.println(d2);
        }
    }
}

我以为的输出是这样的:

0.02
0.03
0.04
0.05
0.06
0.07
0.08
0.09
0.10
0.11

实际是这样的:

0.02
0.03
0.04
0.05
0.060000000000000005
0.07
0.08
0.09
0.09999999999999999
0.10999999999999999

一脸懵逼的看完一篇博客,似懂非懂的:程序员必知之浮点数运算原理详解

结论就是:

   很多十进制小数在转换成二进制时,并不能精确表示,只能是近似值。

 

解决办法就是使用BIgDecimal

public static void bigDecimalDemo(){


        BigDecimal b1 = new BigDecimal("0.01");
        BigDecimal b2 = new BigDecimal("0.01");

        for (int i=0; i< 10; i++){
            b2 = b2.add(b1);
            System.out.println(b2);
        }

    }

输出如下:

0.02
0.03
0.04
0.05
0.06
0.07
0.08
0.09
0.10
0.11

 

Java 浮点数相加

标签:不能   bsp   sdn   博客   hang   原理   小数   解决   rgs   

原文地址:https://www.cnblogs.com/Springmoon-venn/p/10118412.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!