何建銳

          Java人生

            BlogJava :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理 ::
            2 隨筆 :: 0 文章 :: 0 評論 :: 0 Trackbacks

          在許多應用開發中,很多時候都會涉及到金額數字的處理,但由于計算機運算是使用二進制代碼進行相關的計算,所以在很多運算中都會出現誤差,現以java語言為例作一些簡單的介紹。

          public Test

          {

                 public static void main(String[] args)

                 {

                        double d=1.10+1.30+1.11;

                        System.out.println(d);

                 }

          }

          運行結果:3.5100000000000007

          與我們所期望的值有所偏差,實際應得到的值應為3.51

           

          解決方法:

          1.  運用BigDecimal類解決運算時的誤差

          import java.math.BigDecimal;

          public Test

          {

                 public static void main(String[] args)

                 {

                        BigDecimal bd1=new BigDecimal("1.10");

                        BigDecimal bd2=new BigDecimal("1.30");

                        BigDecimal bd3=new BigDecimal("1.11");

                        System.out.println(bd1.add(bd2).add(bd3).toString());

                 }

          }

          運行結果:3.51

          思考,如果把上面程序改為:

          import java.math.BigDecimal;

          public Test

          {

                 public static void main(String[] args)

                 {

                        BigDecimal bd1=new BigDecimal(1.10);

                        BigDecimal bd2=new BigDecimal(1.30);

                        BigDecimal bd3=new BigDecimal(1.11);

                        System.out.println(bd1.add(bd2).add(bd3).toString());

                 }

          }

          測試看看,還是會出現誤差!所以請區別來用。

          解法2

          把小數化為整數,用int型進行計算,可以解決運算時出現的誤差

          由于金額的運算一般保留小數點后兩位,故以此作為計算

           

          public Test

          {

                 public static String convertYangToFen(String yang)

                 {

                        String result="";

                        int length=yang.length()-yang.indexOf(".");

                        if(length>3||length<2||yang.indexOf(".")==-1)

                               return "";

                        else if(length==2)

                               result = yang.replaceAll("\\.","")+"0";

                        else

                               result = yang.replaceAll("\\.","");

                        return result;

                 }

                

                 public static String convertFenToYuan(String money)

                 {

                        DecimalFormat decimalFormat = new DecimalFormat("00");

                        return String.valueOf(Long.parseLong(money) / 100)

                                      + "."

                                      + decimalFormat.format(Long.parseLong(String.valueOf(Long

                                                    .parseLong(money) % 100)));

                 }

                 public static void main(String[] args)

                 {

                        long money1=Long.parseLong(convertYangToFen ("1.10"));

                        long money2=Long.parseLong(convertYangToFen ("1.30"));

                        long money3=Long.parseLong(convertYangToFen ("1.11"));

                        long result=money1+money2+money3;

                        System.out.println(convertFenToYuan(String.valueOf(result)));

                 }

           

          }

          運行結果:3.51

          上面所述的兩種方法適用于所有數學運算,在此以加法做為例子,作了簡單的介紹。

          posted on 2007-06-16 14:30 何建銳 閱讀(593) 評論(0)  編輯  收藏

          只有注冊用戶登錄后才能發表評論。


          網站導航:
           
          主站蜘蛛池模板: 甘孜| 珲春市| 万州区| 莱西市| 方山县| 奉新县| 呈贡县| 晋中市| 江山市| 博兴县| 和政县| 中超| 六安市| 双牌县| 聂拉木县| 巧家县| 会宁县| 梁平县| 华安县| 方正县| 贺兰县| 惠水县| 大余县| 绥德县| 仪征市| 澄城县| 南靖县| 申扎县| 灵丘县| 凤凰县| 疏勒县| 怀化市| 天气| 石楼县| 周宁县| 随州市| 赤水市| 察雅县| 师宗县| 洛隆县| 洱源县|