1. 程式人生 > >java 小心使用float和double他可能不如你所想

java 小心使用float和double他可能不如你所想

    public static void main(String[] args) {
      double funds=1.00;
      int itemBought=0;
      //
        double price=.1;
      for(price=.1;funds>=price;price+=.10){
         funds-=price;
         itemBought++;
      }
      //#解釋1
         // 第一次 price=0.1 funds=1.00
        //             #1            #2          #3
        
// for(double price=.1;funds>=price;price+=.10) //不經過#2,#3 price仍然為0.1 進入for迴圈 執行 funds-=prcie 此時funds=1 ,price=0.1 ,結果funds=0,9 // 第二次 執行#3 price+=0.1 得price=0.2 再執行#2 funds>=price 此時funds=0.9,price=0.2,結果為true 進入for迴圈 funds-=price 得funds=0.7 // 第三次 執行#3 price+=0.1 得price=0.30000000000000004 在執行#2 funds>=price 此時funds=0.7,price=0.30000000000000004(開始誤差了) 結果為true 進入for迴圈 funds-=price 得 funds=0.3999999999999999
// 第四次 執行# price+=0.1 得price=0.4 再執行#2 funds>=price 此時funds=0.3999999999999999 ,price=0.4,結果為false 不進入迴圈體 所以itemBought結果為3 //#解釋1 System.out.println(itemBought+" items bought."); System.out.println("change:$"+funds); } 對於誤差解決辦法是使用 BigDecimal,int或long進行貨幣計算,int和long涉及數值大小, BigDecimal則用於對精度要求比較高的場合,下面我們使用BigDecimal寫了個簡單程式碼 package com.hra.riskprice; import com.hra.riskprice.SysEnum.Factor_Type; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import java.math.BigDecimal; import java.util.
*; @SpringBootApplication public class RiskpriceApplication { public static void main(String[] args) { final BigDecimal TEN_CENTS=new BigDecimal(".10"); int itemBought=0; BigDecimal funds=new BigDecimal("1.00"); for(BigDecimal price=TEN_CENTS;funds.compareTo(price)>=0;price=price.add(TEN_CENTS)){ funds=funds.subtract(price); itemBought++; } System.out.println(itemBought+" items bought."); System.out.println("change:$"+funds); } } for迴圈什麼執行的就不分析了,自己除錯下加深映像就好,通常for的執行順序都是如此,感謝觀摩