MDA/MDD/TDD/DDD/DDDDDDD
          posts - 536, comments - 111, trackbacks - 0, articles - 0
            BlogJava :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理

          java處理浮點數

          Posted on 2010-07-27 18:22 leekiang 閱讀(1301) 評論(0)  編輯  收藏 所屬分類: java
          ??? public void testBigDecimalEquals() {
          ?? ???? assertEquals(new BigDecimal("3.50"),new BigDecimal("3.5"));//不相等
          ?? ?}

          ?System.out.println(0.030*100);//輸出3.0
          ?System.out.println(0.031*100);//輸出3.1
          ?System.out.println(0.032*100);//輸出3.2
          ?System.out.println(0.033*100);//輸出3.3000000000000003
          ?System.out.println(0.034*100);//輸出3.4000000000000004
          ?System.out.println(0.035*100);//輸出3.5000000000000004
          ?System.out.println(0.036*100);//輸出3.5999999999999996
          ?System.out.println(0.037*100);//輸出3.6999999999999997
          ?System.out.println(0.038*100);//輸出3.8
          ?System.out.println(0.039*100);//輸出3.9
          ?
          ?BigDecimal b2 = new BigDecimal(0.236);
          ?System.out.println(b2);//輸出0.2359999999999999875655021241982467472553253173828125
          ?
          ?描述:
          ?當我們使用一些"特殊的數字"進行運算時,或者調用BigDecimal中new BigDecimal(double val)進行構造的時候,將得到意想不到的結果。
          ?原因:
          ?Java中,浮點類型是依據IEEE754標準的。IEEE754定義了32位和64位雙精度兩種浮點二進制小數標準。采用二進制表示double,float等浮點數是不準確的。
          同時BigDecimal的API聲明,建議使用new BigDecimal(String val)進行構造,使用new BigDecimal(double val)進行構造的時候,將得到意想不到的結果(The results of this constructor can be somewhat unpredictable)。

          解決辦法:
          1,通過String結合BigDecimal來轉換。
          String val = "0.236";
          //使用new BigDecimal(String val)進行構造
          BigDecimal a = new BigDecimal(""+val);
          BigDecimal b = new BigDecimal(""+100);
          //小數的位數與構造參數的位數一致
          System.out.println(a.multiply(b));//輸出23.600

          2,使用DecimalFormat來確定小數點后位數
          double val = 0.236*100;
          //保留小數點后兩位,若保留三位為"#.000"
          DecimalFormat df = new DecimalFormat("#.00");
          String str = df.format(val);
          System.out.println(Double.valueOf(str));//輸出23.6

          感謝
          http://www.aygfsteel.com/kalman03/archive/2010/10/25/336121.html
          主站蜘蛛池模板: 清丰县| 巍山| 开封县| 墨竹工卡县| 修文县| 鄂托克前旗| 同德县| 常宁市| 九龙县| 印江| 定南县| 长宁县| 新闻| 隆德县| 白朗县| 湄潭县| 广南县| 周至县| 西贡区| 类乌齐县| 天全县| 新泰市| 黑河市| 基隆市| 宜城市| 平原县| 遂昌县| 长武县| 顺昌县| 榆中县| 永定县| 开远市| 永康市| 黄龙县| 海门市| 湖南省| 巴林左旗| 凌海市| 南平市| 黎川县| 益阳市|