何建銳

          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)  編輯  收藏

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


          網站導航:
           
          主站蜘蛛池模板: 始兴县| 弥勒县| 顺义区| 启东市| 四川省| 鹰潭市| 聊城市| 南开区| 金寨县| 武穴市| 吉木萨尔县| 嘉荫县| 平舆县| 郑州市| 邹城市| 青岛市| 西丰县| 丽水市| 甘南县| 万荣县| 津市市| 桐柏县| 江都市| 阳曲县| 黎城县| 新津县| 扎赉特旗| 垣曲县| 南丹县| 马公市| 巴青县| 上栗县| 贡觉县| 承德县| 定安县| 吉木乃县| 安仁县| 长宁县| 杂多县| 托克托县| 天等县|