精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

商業計算中Java高精度計算BigDecimal類

開發 后端
java中的精度計算,比如float和double浮點數,結果并不一定是最精確的。因此,float和double只能用來做科學計算或者是工程計算,在商業計算中我們要用 java.math.BigDecimal。

如果我們編譯運行下面這個程序會看到什么?

  1. public class Test{ 
  2.     public static void main(String args[]){ 
  3.         System.out.println(0.05+0.01); 
  4.         System.out.println(1.0-0.42); 
  5.         System.out.println(4.015*100); 
  6.         System.out.println(123.3/100); 
  7.     } 

你沒有看錯!結果確實是:

0.060000000000000005
0.5800000000000001
401.49999999999994
1.2329999999999999

Java中的簡單浮點數類型float和double不能夠進行運算。不光是Java,在其它很多編程語言中也有這樣的問題。在大多數情況下,計算的結果是準確的,但是多試幾次(可以做一個循環)就可以試出類似上面的錯誤。現在終于理解為什么要有BCD碼了。

這個問題相當嚴重,如果你有9.999999999999元,你的計算機是不會認為你可以購買10元的商品的。

在有的編程語言中提供了專門的貨幣類型來處理這種情況,但是Java沒有。現在讓我們看看如何解決這個問題。

四舍五入

我們的***個反應是做四舍五入。Math類中的round方法不能設置保留幾位小數,我們只能象這樣(保留兩位):

  1. public double round(double value){ 
  2.     return Math.round(value*100)/100.0

非常不幸,上面的代碼并不能正常工作,給這個方法傳入4.015它將返回4.01而不是4.02,如我們在上面看到的

4.015*100=401.49999999999994

因此如果我們要做到精確的四舍五入,不能利用簡單類型做任何運算

java.text.DecimalFormat也不能解決這個問題:

  1. System.out.println(new java.text.DecimalFormat("0.00").format(4.025)); 

輸出是4.02

BigDecimal

在《Effective Java》這本書中也提到這個原則,float和double只能用來做科學計算或者是工程計算,在商業計算中我們要用java.math.BigDecimal。BigDecimal一共有4個構造方法,我們不關心用BigInteger來構造的那兩個,那么還有兩個,它們是:

BigDecimal(double val)
Translates a double into a BigDecimal.
BigDecimal(String val)
Translates the String representation of a BigDecimal into a BigDecimal.

上面的API簡要描述相當的明確,而且通常情況下,上面的那一個使用起來要方便一些。我們可能想都不想就用上了,會有什么問題呢?等到出了問題的時候,才發現上面哪個構造方法的詳細說明中有這么一段:

Note: the results of this constructor can be somewhat unpredictable. One might assume that new BigDecimal(.1) is exactly equal to .1, but it is actually equal to .1000000000000000055511151231257827021181583404541015625. This is so because .1 cannot be represented exactly as a double (or, for that matter, as a binary fraction of any finite length). Thus, the long value that is being passed in to the constructor is not exactly equal to .1, appearances nonwithstanding.
The (String) constructor, on the other hand, is perfectly predictable: new BigDecimal(".1") is exactly equal to .1, as one would expect. Therefore, it is generally recommended that the (String) constructor be used in preference to this one.

原來我們如果需要精確計算,非要用String來構造BigDecimal不可!在《Effective Java》一書中的例子是用String來構造BigDecimal的,但是書上卻沒有強調這一點。

解決方案

現在我們已經可以解決這個問題了,原則是使用BigDecimal并且一定要用String來構造。

但是想像一下吧,如果我們要做一個加法運算,需要先將兩個浮點數轉為String,然后構造成BigDecimal,在其中一個上調用add方法,傳入另一個作為參數,然后把運算的結果(BigDecimal)再轉換為浮點數。你能夠忍受這么煩瑣的過程嗎?下面我們提供一個工具類Arith來簡化操作。它提供以下靜態方法,包括加減乘除和四舍五入:

  1. public static double add(double v1,double v2) 
  2. public static double sub(double v1,double v2) 
  3. public static double mul(double v1,double v2) 
  4. public static double div(double v1,double v2) 
  5. public static double div(double v1,double v2,int scale) 
  6. public static double round(double v,int scale) 

附  錄

源文件Arith.java:

  1. import java.math.BigDecimal; 
  2. /** 
  3. * 由于Java的簡單類型不能夠精確的對浮點數進行運算,這個工具類提供精 
  4. * 確的浮點數運算,包括加減乘除和四舍五入。 
  5. */ 
  6. public class Arith{ 
  7.     //默認除法運算精度 
  8.     private static final int DEF_DIV_SCALE = 10
  9.     //這個類不能實例化 
  10.     private Arith(){ 
  11.     } 
  12.  
  13.     /** 
  14.      * 提供精確的加法運算。 
  15.      * @param v1 被加數 
  16.      * @param v2 加數 
  17.      * @return 兩個參數的和 
  18.      */ 
  19.     public static double add(double v1,double v2){ 
  20.         BigDecimal b1 = new BigDecimal(Double.toString(v1)); 
  21.         BigDecimal b2 = new BigDecimal(Double.toString(v2)); 
  22.         return b1.add(b2).doubleValue(); 
  23.     } 
  24.     /** 
  25.      * 提供精確的減法運算。 
  26.      * @param v1 被減數 
  27.      * @param v2 減數 
  28.      * @return 兩個參數的差 
  29.      */ 
  30.     public static double sub(double v1,double v2){ 
  31.         BigDecimal b1 = new BigDecimal(Double.toString(v1)); 
  32.         BigDecimal b2 = new BigDecimal(Double.toString(v2)); 
  33.         return b1.subtract(b2).doubleValue(); 
  34.     }  
  35.     /** 
  36.      * 提供精確的乘法運算。 
  37.      * @param v1 被乘數 
  38.      * @param v2 乘數 
  39.      * @return 兩個參數的積 
  40.      */ 
  41.     public static double mul(double v1,double v2){ 
  42.         BigDecimal b1 = new BigDecimal(Double.toString(v1)); 
  43.         BigDecimal b2 = new BigDecimal(Double.toString(v2)); 
  44.         return b1.multiply(b2).doubleValue(); 
  45.     } 
  46.  
  47.     /** 
  48.      * 提供(相對)精確的除法運算,當發生除不盡的情況時,精確到 
  49.      * 小數點以后10位,以后的數字四舍五入。 
  50.      * @param v1 被除數 
  51.      * @param v2 除數 
  52.      * @return 兩個參數的商 
  53.      */ 
  54.     public static double div(double v1,double v2){ 
  55.         return div(v1,v2,DEF_DIV_SCALE); 
  56.     } 
  57.  
  58.     /** 
  59.      * 提供(相對)精確的除法運算。當發生除不盡的情況時,由scale參數指 
  60.      * 定精度,以后的數字四舍五入。 
  61.      * @param v1 被除數 
  62.      * @param v2 除數 
  63.      * @param scale 表示表示需要精確到小數點以后幾位。 
  64.      * @return 兩個參數的商 
  65.      */ 
  66.     public static double div(double v1,double v2,int scale){ 
  67.         if(scale<0){ 
  68.             throw new IllegalArgumentException( 
  69.                 "The scale must be a positive integer or zero"); 
  70.         } 
  71.         BigDecimal b1 = new BigDecimal(Double.toString(v1)); 
  72.         BigDecimal b2 = new BigDecimal(Double.toString(v2)); 
  73.         return b1.divide(b2,scale,BigDecimal.ROUND_HALF_UP).doubleValue(); 
  74.     } 
  75.  
  76.     /** 
  77.      * 提供精確的小數位四舍五入處理。 
  78.      * @param v 需要四舍五入的數字 
  79.      * @param scale 小數點后保留幾位 
  80.      * @return 四舍五入后的結果 
  81.      */ 
  82.     public static double round(double v,int scale){ 
  83.         if(scale<0){ 
  84.             throw new IllegalArgumentException( 
  85.                 "The scale must be a positive integer or zero"); 
  86.         } 
  87.         BigDecimal b = new BigDecimal(Double.toString(v)); 
  88.         BigDecimal one = new BigDecimal("1"); 
  89.         return b.divide(one,scale,BigDecimal.ROUND_HALF_UP).doubleValue(); 
  90.     } 
  91. }; 

***我們利用BigDecimal提供的精確計算來對最開始提到的例子進行測試 :

  1. public class Test { 
  2.  
  3.        public static void main(String[] args) { 
  4.               //直接使用浮點數進行計算,得到的結果是有問題的 
  5.               System.out.println(0.01+0.05); 
  6.               //使用了BigDecimal類進行計算后,可以做到精確計算 
  7.               System.out.println(Arith.add(0.050.01)); 
  8.        } 

控制臺輸出:

0.060000000000000005
0.06

BigDecimal精度計算的舍入模式

ROUND_CEILING. 類 java.math.BigDecimal 中的靜態變量:如果 BigDecimal 為正,則作 ROUND_UP 操作;如果為負,則作 ROUND_DOWN 操作。

ROUND_DOWN. 類 java.math.BigDecimal 中的靜態變量:從不在舍棄(即截斷)的小數之前增加數字。

ROUND_FLOOR. 類 java.math.BigDecimal 中的靜態變量:如果 BigDecimal 為正,則作 ROUND_UP ;如果為負,則作 ROUND_DOWN 。

ROUND_HALF_DOWN. 類 java.math.BigDecimal 中的靜態變量:若舍棄部分> .5 ,則作 ROUND_DOWN;否則,作 ROUND_DOWN 操作。

ROUND_HALF_EVEN. 類 java.math.BigDecimal 中的靜態變量:如果舍棄部分左邊的數字為奇數,則作 ROUND_HALF_UP 操作;如果它為偶數,則作 ROUND_HALF_DOWN 操作。

ROUND_HALF_UP. 類 java.math.BigDecimal 中的靜態變量:若舍棄部分>=.5,則作 ROUND_UP ;否則,則作 ROUND_DOWN。

ROUND_UNNECESSARY. 類 java.math.BigDecimal 中的靜態變量:該 “偽舍入模式”實際是要求操作有一個精確結果,,因此不需要舍入。

ROUND_UP. 類 java.math.BigDecimal 中的靜態變量:總是在非零的舍棄小數(即截斷)之前增加數字。

原文鏈接:http://philipho123.iteye.com/blog/1257464

【編輯推薦】

  1. 去故就新 Java線程新同步機制
  2. Java的ClassLoader機制解析
  3. 用JavaScript編寫JVM可成功運行Java程序
  4. 精解Java中代理模式的實現
  5. Java中的分形幾何:把遞歸用到***
責任編輯:林師授 來源: philipho123的博客
相關推薦

2023-06-30 08:10:14

JavaBigDecimal

2024-04-15 00:00:00

LongBigDecimal運算

2010-03-19 13:44:37

云計算

2023-06-19 11:29:48

云計算業務運營

2020-03-02 14:55:02

JavaBigDecimalAPI

2016-02-19 10:40:42

ZD至頂網軟件頻道

2014-09-04 15:43:11

云計算CIOIT信息化

2020-07-15 11:58:19

物聯網邊緣計算技術

2010-03-22 14:54:35

2025-08-01 02:00:00

BigDecimal精度計算

2024-10-25 14:39:26

BigDecimal精度數值

2019-05-20 15:12:01

云計算商業智能AWS

2009-06-17 13:18:21

BigDecimal類Java

2014-12-12 12:14:42

青云

2016-11-16 11:17:08

商業智能云計算大數據

2011-05-20 10:38:13

北森云計算

2009-12-09 09:40:31

Linux云計算

2012-07-25 09:15:50

云計算企業商業模式

2015-09-17 00:36:00

2022-12-23 08:37:16

BigDecimaljava
點贊
收藏

51CTO技術棧公眾號

黄色a级三级三级三级| 国产精品地址| 精品久久香蕉国产线看观看gif| 91九色对白| 涩视频在线观看| 日韩精品极品| 国产精品第五页| 国产麻豆9l精品三级站| 色婷婷激情一区二区三区| 久久国产一区| 美女搡bbb又爽又猛又黄www| 五月婷在线视频| 日韩av网站在线观看| 欧美综合视频在线观看| 一区二区三区三区在线| 精品国产乱码一区二区三 | 综合久久久久| 在线观看日韩国产| 成人亲热视频网站| 美女100%露胸无遮挡| 日本一区二区乱| 色综合久久88色综合天天| 色爽爽爽爽爽爽爽爽| 国内av一区二区三区| 黄色片免费网址| 国产成人精品一区二区三区四区| 菠萝菠萝蜜在线视频免费观看| 亚洲精品在线观看免费| 欧美喷潮久久久xxxxx| 日韩1区2区| av网站在线免费播放| 日韩精品在线视频免费观看| 800av在线播放| 国产精品99久久久久久董美香| 亚洲va韩国va欧美va精品| 在线国产精品网| 香蕉久久久久久久| 日日碰狠狠添天天爽超碰97| 国产原创av在线| 久久国产免费看| 欧美在线国产精品| 超碰人人人人人人人| 久久资源综合| 欧美一区二区高清| 99久久无色码| 一区二区三区亚洲视频| 一区二区影视| 欧美日韩一区三区四区| 黄色网页免费在线观看| 91超碰在线| 亚洲国产成人av网| 免费的一级黄色片| 三级网站视频在在线播放| 亚洲色图清纯唯美| 警花观音坐莲激情销魂小说| 91福利视频在线观看| 污网站在线免费| 亚洲国产www| 日韩午夜电影| 日韩精品久久久久| 真人bbbbbbbbb毛片| 欧美激情99| 精品99一区二区| 在线中文字日产幕| 深夜激情久久| 亚洲人成免费网站| 亚洲激情成人网| 变态另类丨国产精品| 亚洲欧美校园春色| 伊人伊人伊人久久| av在线播放中文字幕| 欧美独立站高清久久| 26uuu精品一区二区三区四区在线| 日韩欧美中文一区| 五月天视频在线观看| 在线视频成人| 国产精品人成在线观看免费| 国产成人久久精品| 中文字幕免费高清网站| 99综合精品| 日本精品视频网站| 日韩精品一区不卡| 艳女tv在线观看国产一区| 久久精品久久久久久| 久久精品女人的天堂av| 啊v在线视频| 亚洲精品中文在线观看| 国产一区在线免费| 免费国产在线观看| 欧美一级全黄| 国产一级av毛片| 国产97色在线|日韩| 中文字幕在线免费看线人| 日本一区二区三区电影免费观看| 精品国产免费久久| 丰满少妇一区二区三区专区| 国产精品主播在线观看| 亚洲欧美日韩国产精品| 色欲av无码一区二区三区| 超碰成人在线免费| 亚洲天堂av女优| 精品国产视频在线观看| 国产情侣久久| 国产丝袜一区二区三区| 少妇性l交大片7724com| 亚洲女娇小黑人粗硬| 欧美老女人性视频| 乱子伦一区二区三区| 国产盗摄一区二区三区| 欧美视频1区| 午夜av在线播放| 欧美大片1688| 国产精品国产馆在线真实露脸| 中文字幕人妻熟女人妻洋洋| 外国电影一区二区| 欧美在线你懂得| av电影在线播放| 成人乱码手机视频| 精品福利一区二区三区免费视频| 2017亚洲天堂| 国产精品亚洲欧美| 亚洲淫片在线视频| 成人在线二区| 亚洲成人av福利| 欧美第一页浮力影院| 亚洲精品国模| 97精品免费视频| www.四虎在线观看| 成人欧美一区二区三区| 久久婷婷国产91天堂综合精品| 美女视频亚洲色图| heyzo一区| 天堂蜜桃91精品| 91精品视频免费看| 欧美成欧美va| 韩国成人福利片在线播放| 明星裸体视频一区二区| 1区2区3区在线观看| 第一福利永久视频精品| 中文字幕视频观看| 欧美老女人另类| 日韩美女福利视频| 国产高潮国产高潮久久久91| 免费高清在线一区| 日韩av在线一区二区三区| 黑人巨大亚洲一区二区久| 亚洲精品美女在线| 久久艹免费视频| 91视频xxxx| 国产色视频一区| 成人免费观看视频在线观看| 最新亚洲国产| 亚洲视频在线播放| 久久久久久久中文字幕| 国产在线播放一区| 美乳视频一区二区| 国产在线高清视频| 国产精品免费看| 99超碰麻豆| 午夜国产在线观看| 国产无遮挡一区二区三区毛片日本| 那种视频在线观看| 欧洲grand老妇人| 国产经典一区二区| 香港伦理在线| 日韩视频中午一区| 亚洲一区 视频| 91女人视频在线观看| 92看片淫黄大片一级| 97精品视频| 成人欧美一区二区三区在线观看| 大香伊人久久| 免费看日韩精品| 日韩精品影音先锋| 91狠狠综合久久久久久| 午夜在线一区二区| 亚洲国产精品www| 伊人久久国产| 亚洲国产欧美一区二区三区久久| 久久精品人妻一区二区三区| 91碰在线视频| 欧美午夜精品理论片| 欧美va天堂在线| 国产999精品久久久| a天堂在线资源| 日本一区二区三区四区| 欧美性猛交内射兽交老熟妇| 希岛爱理av免费一区二区| 国产精品午夜国产小视频| a级在线观看| 亚洲乱码国产乱码精品精| 亚洲天堂免费av| 久久精品国产亚洲aⅴ| 亚洲一区二区三区四区在线免费观看 | 亚洲热线99精品视频| 无码人妻精品一区二区三区不卡| 91在线看国产| 亚洲人视频在线| 天天插综合网| 国产69精品久久久久9999| 国产美女18xxxx免费视频| 午夜久久福利| 国产在线日韩在线| 欧美调教sm| 欧美老肥婆性猛交视频| 国产在线视频资源| 精品国产免费人成在线观看| 91在线你懂的| 日韩欧美在线播放| av在线不卡观看| 99视频在线免费| 九九在线精品| 成人午夜在线观看| 成人观看网址| 欧美老妇交乱视频| 麻豆视频在线观看免费| 精品国一区二区三区| 波多野结衣家庭主妇| 久久精品国产**网站演员| 国产在线一区二区三区播放| 成人直播在线| 国产一区二区三区在线观看网站 | 成人在线高清| 国产91精品不卡视频| 色呦呦在线视频| 久久精品福利视频| 成人性生交大片免费看午夜| 日韩av在线电影网| 亚洲欧美另类日韩| 五月亚洲婷婷| 精品国产一区二区三区久久久| 天堂а√在线8种子蜜桃视频| 日本一区二区三区国色天香 | 欧美老年两性高潮| av大片在线免费观看| 国产片一区二区| 中文在线一区二区三区| 夜夜夜久久久| 伊人久久大香线蕉精品| 欧美一区二区性| 日韩一区二区三区高清| 国产成人av| 日韩wuma| 日韩专区精品| 亚洲人成影视在线观看| 日韩欧美自拍| 欧美无砖专区一中文字| 99久久国产免费免费| av中文字幕电影在线看| 欧美疯狂性受xxxxx另类| 在线中文字幕第一页| 欧美理论电影在线观看| 日本天码aⅴ片在线电影网站| 久久精品久久久久久国产 免费| caoporn免费在线视频| 91精品国产欧美一区二区18 | 欧洲人成人精品| 日本一级片免费看| 午夜久久久久久久久久一区二区| 久久久久97国产| 9色porny自拍视频一区二区| 欧美无人区码suv| 2021国产精品久久精品| 国产高潮呻吟久久| 国产精品女人毛片| 午夜激情福利网| 一区二区三区电影大全| 欧美精品乱码久久久久久按摩| 给我看免费高清在线观看| 99久久精品情趣| 久久国产精品视频在线观看| 欧美gayvideo| 国产成人精品av在线| 免费污视频在线一区| 97福利一区二区| 国产日韩电影| 国产精品美女主播在线观看纯欲| 91精品视频一区二区| 国产精品第一区| 黄色精品免费看| 一级做a爰片久久毛片美女图片| 久青草免费视频| 亚洲福利国产精品| 天堂免费在线视频| 欧美一区在线视频| 日本在线视频1区| 久久久www成人免费精品张筱雨 | 欧美性视频网站| 少妇又紧又色又爽又刺激视频| 国产精品一区二区在线看| 中文字幕视频观看| 中文字幕av一区二区三区高 | 国内爆初菊对白视频| 亚洲天堂男人天堂女人天堂| 午夜视频免费看| 一区二区三区欧美在线观看| 久久国产精品国语对白| 欧美日韩亚洲一区二| 一本大道伊人av久久综合| 日韩欧美一区二区不卡| 头脑特工队2在线播放| 8x8x8国产精品| 美州a亚洲一视本频v色道| 欧美精品手机在线| 黄色综合网址| 国产精品一区二| 99精品美女| 精品少妇无遮挡毛片| 岛国毛片av在线| 欧美一级在线免费| 日韩精品成人一区| 4438x成人网最大色成网站| 色视频在线观看免费| 久久亚洲国产精品| 国产精品久久久久久久免费看| 亚洲跨种族黑人xxx| 丝袜综合欧美| 国产精品久久久久免费a∨大胸 | 六月婷婷综合| 亚洲欧美另类中文字幕| 人妻91麻豆一区二区三区| 不卡伊人av在线播放| av久久网站| 日韩女优中文字幕| 亚洲自啪免费| 波多野结衣视频播放| 一区二区三区欧美| 国产免费黄色片| 日韩一二三在线视频播| 国产综合色区在线观看| 免费看成人午夜电影| 成年网站在线| 亚洲第一福利视频在线| 中文字幕在线视频免费| 欧美精品一区二区三| 天天干天天舔天天射| 亚洲国产美女精品久久久久∴| 激情av在线| 欧美激情亚洲一区| 波多野结衣视频一区二区| 欧美亚洲激情视频| 国产精品美女久久久久人| 亚洲午夜精品久久久久久浪潮| 久久久久久一区二区| 中文字幕无码人妻少妇免费| 亚洲成人在线观看视频| 亚洲国产精品欧美久久| 久久国产精品亚洲| 日韩在线成人| 成人小视频在线观看免费| 成人一区在线观看| 久久精品国产亚洲av香蕉 | 色婷婷激情综合| 国产精品自偷自拍| 亚洲跨种族黑人xxx| 朝桐光一区二区| 国产经品一区二区| 99在线精品视频在线观看| theav精尽人亡av| 一区二区三区不卡在线观看| 亚洲精品国产片| 91精品91久久久久久| 老司机成人在线| 日本精品免费在线观看| 老司机午夜精品| 色欲色香天天天综合网www| 日本成人中文字幕在线视频| 娇小11一12╳yⅹ╳毛片| 日韩一卡二卡三卡| 变态调教一区二区三区| 蜜桃视频成人| 蜜桃久久av一区| 国产精品老熟女一区二区| 亚洲国产高清自拍| 三级成人在线| 免费观看国产视频在线| 粉嫩欧美一区二区三区高清影视| 手机在线看福利| 免费在线成人激情电影| 91精品国产综合久久香蕉的用户体验 | 水蜜桃亚洲精品| 国产综合久久久久影院| 欧美成人dvd在线视频| 日韩国产欧美在线观看| 久久嫩草捆绑紧缚| 欧美一级精品大片| 99re6在线精品视频免费播放| 蜜桃传媒视频麻豆第一区免费观看| 欧美激情777| 国产美女视频免费观看下载软件| 欧美色欧美亚洲另类二区| 日本一本在线免费福利| 五月天婷亚洲天综合网鲁鲁鲁| 国产精品白丝jk黑袜喷水| 无码人妻久久一区二区三区不卡| 欧美成人午夜激情在线| 色棕色天天综合网| 免费看91视频| 首页欧美精品中文字幕| 国产精品国产一区二区 |