1. 程式人生 > >Java 浮點數相加

Java 浮點數相加

  剛剛遇到個需求,需要對金額求和,上線的時候才知道這時個,這個欄位是個小數。

  隨手就改了個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