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

Java中的BigDecimal類你了解多少?

開發(fā) 后端
在一般開發(fā)過程中,我們數(shù)據(jù)庫中存儲的數(shù)據(jù)都是float和double類型的。在進行拿來拿去運算的時候還需要不斷的轉(zhuǎn)化,這樣十分的不方便。

[[316872]]

前言

我們都知道浮點型變量在進行計算的時候會出現(xiàn)丟失精度的問題。如下一段代碼:

  1. System.out.println(0.05 + 0.01); 
  2. System.out.println(1.0 - 0.42); 
  3. System.out.println(4.015 * 100); 
  4. System.out.println(123.3 / 100); 

輸出:

  1. 0.060000000000000005 
  2. 0.5800000000000001 
  3. 401.49999999999994 
  4. 1.2329999999999999 

可以看到在Java中進行浮點數(shù)運算的時候,會出現(xiàn)丟失精度的問題。那么我們?nèi)绻谶M行商品價格計算的時候,就會出現(xiàn)問題。很有可能造成我們手中有0.06元,卻無法購買一個0.05元和一個0.01元的商品。因為如上所示,他們兩個的總和為0.060000000000000005。這無疑是一個很嚴重的問題,尤其是當電商網(wǎng)站的并發(fā)量上去的時候,出現(xiàn)的問題將是巨大的。可能會導致無法下單,或者對賬出現(xiàn)問題。所以接下來我們就可以使用Java中的BigDecimal類來解決這類問題。

普及一下:

Java中float的精度為6-7位有效數(shù)字。double的精度為15-16位。

API

構造器:

  1. 構造器                   描述 
  2. BigDecimal(int)       創(chuàng)建一個具有參數(shù)所指定整數(shù)值的對象。 
  3. BigDecimal(double)    創(chuàng)建一個具有參數(shù)所指定雙精度值的對象。 
  4. BigDecimal(long)      創(chuàng)建一個具有參數(shù)所指定長整數(shù)值的對象。 
  5. BigDecimal(String)    創(chuàng)建一個具有參數(shù)所指定以字符串表示的數(shù)值的對象。 

函數(shù):

  1. 方法                    描述 
  2. add(BigDecimal)       BigDecimal對象中的值相加,然后返回這個對象。 
  3. subtract(BigDecimal)  BigDecimal對象中的值相減,然后返回這個對象。 
  4. multiply(BigDecimal)  BigDecimal對象中的值相乘,然后返回這個對象。 
  5. divide(BigDecimal)    BigDecimal對象中的值相除,然后返回這個對象。 
  6. toString()            將BigDecimal對象的數(shù)值轉(zhuǎn)換成字符串。 
  7. doubleValue()         將BigDecimal對象中的值以雙精度數(shù)返回。 
  8. floatValue()          將BigDecimal對象中的值以單精度數(shù)返回。 
  9. longValue()           將BigDecimal對象中的值以長整數(shù)返回。 
  10. intValue()            將BigDecimal對象中的值以整數(shù)返回。 

由于一般的數(shù)值類型,例如double不能準確的表示16位以上的數(shù)字。

BigDecimal精度也丟失

我們在使用BigDecimal時,使用它的BigDecimal(String)構造器創(chuàng)建對象才有意義。其他的如BigDecimal b = new BigDecimal(1)這種,還是會發(fā)生精度丟失的問題。如下代碼:

  1. BigDecimal a = new BigDecimal(1.01); 
  2. BigDecimal b = new BigDecimal(1.02); 
  3. BigDecimal c = new BigDecimal("1.01"); 
  4. BigDecimal d = new BigDecimal("1.02"); 
  5. System.out.println(a.add(b)); 
  6. System.out.println(c.add(d)); 

輸出:

  1. 2.0300000000000000266453525910037569701671600341796875 
  2. 2.03 

可見論丟失精度BigDecimal顯的更為過分。但是使用Bigdecimal的BigDecimal(String)構造器的變量在進行運算的時候卻沒有出現(xiàn)這種問題。 究其原因計算機組成原理里面都有,它們的編碼決定了這樣的結果。long可以準確存儲19位數(shù)字,而double只能準備存儲16位數(shù)字。double由于有exp位,可以存16位以上的數(shù)字,但是需要以低位的不精確作為代價。如果需要高于19位數(shù)字的精確存儲,則必須用BigInteger來保存,當然會犧牲一些性能。所以我們一般使用BigDecimal來解決商業(yè)運算上丟失精度的問題的時候,聲明BigDecimal對象的時候一定要使用它構造參數(shù)為String的類型的構造器。

同時這個原則Effective Java和MySQL 必知必會中也都有提及。float和double只能用來做科學計算和工程計算。商業(yè)運算中我們要使用BigDecimal。

而且我們從源碼的注釋中官方也給出了說明,如下是BigDecimal類的double類型參數(shù)的構造器上的一部分注釋說明:

  1. The results of this constructor can be somewhat unpredictable. 
  2.      * One might assume that writing {@code new BigDecimal(0.1)} in 
  3.      * Java creates a {@code BigDecimal} which is exactly equal to 
  4.      * 0.1 (an unscaled value of 1, with a scale of 1), but it is 
  5.      * actually equal to 
  6.      * 0.1000000000000000055511151231257827021181583404541015625. 
  7.      * This is because 0.1 cannot be represented exactly as a 
  8.      * {@code double} (orfor that matter, as a binary fraction of 
  9.      * any finite length).  Thus, the value that is being passed 
  10.      * <i>in</i> to the constructor is not exactly equal to 0.1, 
  11.      * appearances notwithstanding. 
  12.        …… 
  13.         * When a {@code double} must be used as a source for a 
  14.      * {@code BigDecimal}, note that this constructor provides an 
  15.      * exact conversion; it does not give the same result as 
  16.      * converting the {@code doubleto a {@code String} using the 
  17.      * {@link Double#toString(double)} method and then using the 
  18.      * {@link #BigDecimal(String)} constructor.  To get that result, 
  19.      * use the {@code static} {@link #valueOf(double)} method. 
  20.      * </ol> 
  21. public BigDecimal(double val) { 
  22.     this(val,MathContext.UNLIMITED); 

第一段也說的很清楚它只能計算的無限接近這個數(shù),但是無法精確到這個數(shù)。第二段則說,如果要想準確計算這個值,那么需要把double類型的參數(shù)轉(zhuǎn)化為String類型的。并且使用BigDecimal(String)這個構造方法進行構造。 去獲取結果。

正確運用BigDecimal

另外,BigDecimal所創(chuàng)建的是對象,我們不能使用傳統(tǒng)的+、-、*、/等算術運算符直接對其對象進行數(shù)學運算,而必須調(diào)用其相對應的方法。方法中的參數(shù)也必須是BigDecimal的對象,由剛才我們所羅列的API也可看出。

在一般開發(fā)過程中,我們數(shù)據(jù)庫中存儲的數(shù)據(jù)都是float和double類型的。在進行拿來拿去運算的時候還需要不斷的轉(zhuǎn)化,這樣十分的不方便。這里我寫了一個工具類:

  1. /** 
  2.  * @author: Ji YongGuang. 
  3.  * @date: 19:50 2017/12/14. 
  4.  */ 
  5. public class BigDecimalUtil { 
  6.  
  7.     private BigDecimalUtil() { 
  8.  
  9.     } 
  10.  
  11.     public static BigDecimal add(double v1, double v2) {// v1 + v2 
  12.         BigDecimal b1 = new BigDecimal(Double.toString(v1)); 
  13.         BigDecimal b2 = new BigDecimal(Double.toString(v2)); 
  14.         return b1.add(b2); 
  15.     } 
  16.  
  17.     public static BigDecimal sub(double v1, double v2) { 
  18.         BigDecimal b1 = new BigDecimal(Double.toString(v1)); 
  19.         BigDecimal b2 = new BigDecimal(Double.toString(v2)); 
  20.         return b1.subtract(b2); 
  21.     } 
  22.  
  23.     public static BigDecimal mul(double v1, double v2) { 
  24.         BigDecimal b1 = new BigDecimal(Double.toString(v1)); 
  25.         BigDecimal b2 = new BigDecimal(Double.toString(v2)); 
  26.         return b1.multiply(b2); 
  27.     } 
  28.  
  29.     public static BigDecimal div(double v1, double v2) { 
  30.         BigDecimal b1 = new BigDecimal(Double.toString(v1)); 
  31.         BigDecimal b2 = new BigDecimal(Double.toString(v2)); 
  32.         // 2 = 保留小數(shù)點后兩位   ROUND_HALF_UP = 四舍五入 
  33.         return b1.divide(b2, 2, BigDecimal.ROUND_HALF_UP);// 應對除不盡的情況 
  34.     } 

該工具類提供了double類型的基本的加減乘除運算。直接調(diào)用即可。

責任編輯:武曉燕 來源: 簡書
相關推薦

2023-02-24 14:46:32

Java線程池編程

2023-05-06 08:53:13

2016-08-17 10:24:28

2023-09-18 08:56:57

StringJava

2021-08-11 08:44:25

云計算混合云云網(wǎng)協(xié)同

2023-12-09 08:58:30

AndroidActivity啟動模式

2015-11-09 10:44:37

DevOpsIT運維

2020-06-04 14:15:55

Java中BigDecimal函數(shù)

2022-08-01 08:37:45

Java池化緩存

2020-03-25 08:47:22

智能邊緣邊緣計算網(wǎng)絡

2023-12-11 13:59:00

YieldPython生成器函數(shù)

2021-06-06 18:22:04

PprofGopher邏輯

2012-12-27 10:58:24

KVMKVM概念

2023-10-29 08:35:47

AndroidAOP編程

2023-10-25 08:17:06

Lite模式代理類

2023-09-26 07:44:52

JavaJVM

2022-06-07 07:37:40

線程進程開發(fā)

2019-08-07 17:18:18

云計算云原生函數(shù)

2011-08-23 11:03:35

ATM

2022-02-08 12:06:12

云計算
點贊
收藏

51CTO技術棧公眾號

中文字幕一区二区三区不卡在线| 香蕉av一区二区| 色综合久久综合| 亚洲精品无人区| 国产农村妇女毛片精品久久| 136国产福利精品导航网址| 亚洲欧美一区二区三区久久| 国产精品国产自产拍高清av水多| 日韩成人av免费| 男男gaygays亚洲| 91麻豆高清视频| 国产剧情日韩欧美| 天天综合网入口| 久久爱www.| 色综合一个色综合亚洲| 超碰97免费观看| 日本天堂影院在线视频| 极品美女销魂一区二区三区免费| 欧美亚洲视频一区二区| 日本在线一级片| 国产日产精品一区二区三区四区的观看方式 | 成人av网站在线观看免费| 国产精品国产三级国产aⅴ浪潮 | 91精品国产欧美一区二区18 | 粉嫩一区二区| 一区二区不卡在线视频 午夜欧美不卡在| 欧美大香线蕉线伊人久久| 国产女人高潮毛片| 免费成人你懂的| 青青久久av北条麻妃黑人| 麻豆视频在线观看| 亚洲成人三区| 日韩午夜在线视频| 国产黄片一区二区三区| 一区二区三区免费在线看| ...av二区三区久久精品| 精品国产一区二区三区麻豆小说| 99热这里只有精品5| 欧美aaaaaa午夜精品| 欧美在线亚洲在线| 欧美一二三区视频| 亚洲国产三级| 国外色69视频在线观看| 高h视频免费观看| 888久久久| 日韩三级影视基地| 99热在线观看精品| 天天射—综合中文网| 日韩中文在线中文网三级| 国产人妻大战黑人20p| 日韩av网站在线免费观看| 亚洲国产成人在线视频| 久久久久亚洲AV成人网人人小说| 香蕉免费一区二区三区在线观看| 日韩一级成人av| 午夜诱惑痒痒网| 青青青青在线| 91蝌蚪国产九色| 精品午夜一区二区| 日本中文字幕一区二区有码在线| 91在线视频官网| 欧美大香线蕉线伊人久久国产精品| 欧美一级做性受免费大片免费| 性感少妇一区| 国产va免费精品高清在线观看| 黄色免费av网站| 久久在线精品| 国产精品一区二区在线| 91一区二区视频| 国产成人av资源| 精品一区二区三区国产| 日韩av视屏| 日本一区二区三区四区| 自拍亚洲欧美老师丝袜| 人人超在线公开视频| 午夜久久久影院| 久久综合久久色| 日韩成人免费av| 欧美mv日韩mv国产网站app| 国产精品成人99一区无码| 欧美福利在线播放网址导航| 国产亚洲精品久久久优势| 国产精品白丝喷水在线观看| 激情成人亚洲| 国产精品免费小视频| 精品人妻伦一二三区久久| 成人免费观看av| 日本a级片久久久| 超碰免费在线播放| 欧美性xxxxxxxxx| 色一情一区二区| 国产成人tv| 一区二区三区视频观看| 2021亚洲天堂| 久久男女视频| 99re在线视频上| 极品白浆推特女神在线观看| 最新久久zyz资源站| 欧美亚洲精品一区二区| 亚洲精品乱码日韩| 亚洲成人中文字幕| 女性裸体视频网站| 香蕉av777xxx色综合一区| 成人国产在线激情| 亚洲av人无码激艳猛片服务器| 9色国产精品| 国产精品永久在线| 视频一区 中文字幕| 国产精品国产三级国产普通话99| 无码专区aaaaaa免费视频| 成人性片免费| 精品中文视频在线| 久热这里只有精品在线| 乱一区二区av| 久久久av水蜜桃| 羞羞的视频在线观看| 在线观看欧美黄色| 亚洲久久久久久| 欧美喷水视频| 国产在线视频一区| 国产二区在线播放| 欧美色xxxx| 亚洲无人区码一码二码三码| 久久综合国产| 日韩视频免费在线| 免费黄色片视频| 99精品1区2区| 国产69精品久久久久999小说| 国产 日韩 欧美| 伊人久久久久久久久久久久久| 久久草视频在线| 国产福利一区二区| 国产女人18毛片| 成人免费观看49www在线观看| 亚洲人成在线电影| 欧美风情第一页| 秋霞电影一区二区| 色噜噜狠狠一区二区三区| 成人欧美magnet| 亚洲精品一区二区三区不| 国产超碰人人爽人人做人人爱| 成人一级黄色片| 亚洲熟妇无码av在线播放| 91资源在线观看| 精品久久人人做人人爰| 欧美成人三级在线观看| 国产精品资源在线看| 992tv成人免费观看| 成人av在线播放| 久久亚洲一区二区三区四区五区高| 全程偷拍露脸中年夫妇| 久草热8精品视频在线观看| 亚洲国产欧美一区二区三区不卡| 91综合国产| www.日韩.com| a网站在线观看| 亚洲最快最全在线视频| 亚洲一区二区三区四区av| 亚洲人成久久| 国产精品国产亚洲精品看不卡15| 丝袜中文在线| 亚洲国产精品一区二区久| 日韩激情在线播放| 久久久综合视频| wwww.国产| 91精品国产乱码久久久久久| 91av免费看| www在线观看黄色| 在线观看91精品国产入口| 色噜噜噜噜噜噜| 韩国女主播成人在线| 成人一级生活片| 天海翼亚洲一区二区三区| 日韩女优在线播放| 中文字幕在线免费| 精品日韩一区二区三区| 99热只有这里有精品| 中文字幕欧美激情一区| 国产xxxxhd| 亚洲一区二区动漫| 亚洲精品国产精品国自产| 精品国产三区在线| 91豆花精品一区| 99riav在线| 精品国产髙清在线看国产毛片| 国产成人无码精品久在线观看 | 欧美一级久久久| 日韩污视频在线观看| 国产精品入口麻豆原神| 亚洲熟妇av一区二区三区漫画| 精品一区三区| 亚洲在线www| 日韩电影免费观| 欧美裸体xxxx极品少妇| 精品乱码一区二区三四区视频 | 91午夜在线播放| 激情黄产视频在线免费观看| 中文字幕久久亚洲| 黄频网站在线观看| 欧美性色黄大片| 亚洲综合一二三| 亚洲三级免费观看| 欧洲美一区二区三区亚洲 | 成人精品999| 国产mv日韩mv欧美| www.日本一区| 国产色综合网| 国内自拍中文字幕| 久久影院一区| 麻豆成人在线播放| 影音先锋欧美激情| 国产区精品在线观看| 最新中文字幕在线播放| 九九热这里只有精品6| 北岛玲一区二区三区| 亚洲国产精久久久久久 | 最新日韩一区| 97超碰国产精品女人人人爽| 中文国产字幕在线观看| 中文字幕亚洲综合久久| 男人的天堂在线视频| 亚洲精品aⅴ中文字幕乱码| 亚洲精品福利网站| 91精品国产综合久久精品图片| 精品国产www| 色婷婷综合激情| 免费观看成人毛片| 午夜欧美一区二区三区在线播放| 激情视频在线播放| 亚洲日本韩国一区| 成人信息集中地| 欧美激情一区二区三区四区| 中文字幕人妻一区二区| 91麻豆免费视频| 三叶草欧洲码在线| hitomi一区二区三区精品| 成人网站免费观看入口| 一区二区中文| eeuss中文| 婷婷色综合网| 国产在线拍揄自揄拍无码| 久久综合99| 国产欧美综合一区| 欧美在线亚洲综合一区| 日韩人妻一区二区三区蜜桃视频| 久久电影院7| 99精品视频网站| 亚洲精品久久| 日本阿v视频在线观看| 国产精品羞羞答答在线观看| 九九久久99| 一道本一区二区三区| 欧美国产二区| 国产日产精品_国产精品毛片| 五月婷婷一区| 97精品国产| 黑人巨茎大战欧美白妇 | 欧美日韩在线成人| 日韩av中文字幕一区二区| 性刺激的欧美三级视频| 精品一区二区三区不卡| 日本xxxx免费| www.在线成人| 香蕉视频久久久| 自拍偷拍亚洲激情| 久久久无码精品亚洲国产| 亚瑟在线精品视频| 波多野结衣人妻| 3atv一区二区三区| 人妻无码中文字幕免费视频蜜桃| 日韩av最新在线观看| 国产黄色免费在线观看| 久久精品国产精品| 黑人另类精品××××性爽| 91成人精品网站| 国模套图日韩精品一区二区| 国产日韩欧美在线观看| 999久久久精品一区二区| 国产精品极品美女在线观看免费 | 久久大片网站| 精品一区二区三| 精品人妻人人做人人爽| 久久三级视频| 日本亚洲一区二区三区| 91丝袜呻吟高潮美腿白嫩在线观看| 精品无码在线观看| 亚洲精品日韩综合观看成人91| 蜜桃av免费观看| 夜夜揉揉日日人人青青一国产精品| 亚洲 欧美 日韩 综合| 欧美日韩免费视频| av首页在线观看| 日韩欧美另类在线| 久久久资源网| 欧美精品18videosex性欧美| 日韩欧美一区二区三区在线观看| 91久久久久久久久久久久久| 欧美亚洲色图校园春色| 一区一区视频| 久久99伊人| 人妻有码中文字幕| 亚洲在线观看| 国内自拍第二页| 久久一留热品黄| 激情五月婷婷小说| 欧美日产在线观看| 内衣办公室在线| 国产69精品久久久久99| 999久久久国产999久久久| 欧美一级二级三级| 在线国产欧美| 国产又粗又猛大又黄又爽| 日本一区二区三区在线观看| 1级黄色大片儿| 欧美一二区视频| 3d成人动漫在线| 人人爽久久涩噜噜噜网站| 1313精品午夜理伦电影| 伊人久久大香线蕉精品| 久久婷婷av| 国产在线观看无码免费视频| 亚洲影院久久精品| 超碰在线人人干| 久久手机免费视频| 久久不卡日韩美女| 日韩中文不卡| 日韩激情视频网站| 一本色道综合久久欧美日韩精品 | av观看免费在线| av电影在线观看不卡| 久久久久久久福利| 欧美一级日韩免费不卡| 欧美13一16娇小xxxx| 国产精品久久久精品| 国产最新精品| 欧美性猛交久久久乱大交小说 | 在线高清av| 久久av一区二区| 99在线精品视频在线观看| 男女性杂交内射妇女bbwxz| 亚洲图片有声小说| 人妻丰满熟妇av无码区hd| 欧美极品欧美精品欧美视频| av日韩在线播放| 精品少妇人妻av免费久久洗澡| 波多野结衣中文字幕一区二区三区| 日韩免费一二三区| 精品国产一区二区三区久久影院| 特级毛片在线| 国产区二精品视| 国产精品久久久久久久免费软件| 亚洲色图14p| 色噜噜偷拍精品综合在线| 东凛在线观看| 成人在线小视频| 欧美伊人影院| 少妇被狂c下部羞羞漫画| 精品日本高清在线播放| 免费人成黄页在线观看忧物| 国产精品69久久| 999久久久免费精品国产| 岛国毛片在线播放| 亚洲狠狠丁香婷婷综合久久久| 日韩不卡视频在线| 亚洲女人被黑人巨大进入| 日本成人片在线| 蜜臀av.com| 91亚洲永久精品| 中文字幕乱码中文字幕| 大胆人体色综合| 卡通动漫国产精品| 成人性生生活性生交12| 亚洲欧美经典视频| 天堂中文在线看| 国产精品一区二区三区成人| 中文字幕一区二区三区在线视频| 妖精视频一区二区| 91黄色激情网站| 日日夜夜天天综合入口| 欧美精品一区二区三区在线四季 | 免费的黄网站在线观看| 福利精品视频| 日韩avvvv在线播放| 欧美成人综合色| 亚洲人成电影在线| 精品一区二区三区中文字幕| 欧美啪啪免费视频| 亚洲欧洲国产日本综合| 三级网站在线看| 国产日韩av在线播放| 日韩午夜在线| 小泽玛利亚一区| 日韩电影网在线| av日韩一区| 日韩亚洲在线视频| 亚洲视频在线一区| 久久手机免费观看| 国产精品嫩草在线观看| 六月丁香综合在线视频| 91久久国产视频|