国产精品电影_久久视频免费_欧美日韩国产激情_成年人视频免费在线播放_日本久久亚洲电影_久久都是精品_66av99_九色精品美女在线_蜜臀a∨国产成人精品_冲田杏梨av在线_欧美精品在线一区二区三区_麻豆mv在线看

BigDecimal用錯(cuò)了,哭暈在廁所......

開發(fā) 前端
理論上,它比 double 或 float 更精確,但如果你用得不對(duì),精度丟失的問題會(huì)讓你哭暈在廁所。今天我們就來聊聊 ,錯(cuò)誤使用BigDecimal的6種場(chǎng)景,為什么會(huì)發(fā)生問題,以及怎么避免問題,希望對(duì)你會(huì)有所幫助。

前言

在日常開發(fā)中,很多小伙伴喜歡用 BigDecimal 來處理精確計(jì)算,比如錢、分?jǐn)?shù)、比例啥的。

理論上,它比 double 或 float 更精確,但如果你用得不對(duì),精度丟失的問題會(huì)讓你哭暈在廁所。

今天我們就來聊聊 ,錯(cuò)誤使用BigDecimal的6種場(chǎng)景,為什么會(huì)發(fā)生問題,以及怎么避免問題,希望對(duì)你會(huì)有所幫助。

1.直接用浮點(diǎn)數(shù)初始化

不少小伙伴習(xí)慣這樣寫:

BigDecimal num = new BigDecimal(0.1);
System.out.println(num);

打印結(jié)果:0.1000000000000000055511151231257827021181583404541015625

并非打印的:0.1

問題出在哪?

這不是 BigDecimal 的問題,而是浮點(diǎn)數(shù)本身的“鍋”。

在Java中,double的精度有限的,0.1 轉(zhuǎn)換成二進(jìn)制是個(gè)無限循環(huán)小數(shù),直接傳進(jìn)去會(huì)帶上誤差。

正確姿勢(shì)是傳字符串:

BigDecimal num = new BigDecimal("0.1");
System.out.println(num);

打印結(jié)果:0.1,是正確的。

注意:永遠(yuǎn)不要用 BigDecimal(double) 構(gòu)造函數(shù),用字符串或整數(shù)更靠譜。也可以使用BigDecimal.valueOf()函數(shù)。

2.加減乘除時(shí)不設(shè)精度

有些小伙伴做加減乘除的時(shí)候,直接寫:

BigDecimal a = new BigDecimal("1.03");
BigDecimal b = new BigDecimal("0.42");
//減法
BigDecimal result = a.subtract(b);
System.out.println(result);

打印結(jié)果::0.61,沒問題。

但問題在 除法 時(shí):

BigDecimal c = new BigDecimal("10");
BigDecimal d = new BigDecimal("3");
BigDecimal result = c.divide(d);

運(yùn)行直接炸了:java.lang.ArithmeticException: Non-terminating decimal expansion

報(bào)錯(cuò)的根本原因:10/3 是無限小數(shù),BigDecimal 默認(rèn)不保留小數(shù)點(diǎn)后面,精度溢出。

那么,我們要如何優(yōu)化呢?

答:加一個(gè) MathContext 或指定精度。

例如:

BigDecimal result = c.divide(d, 2, RoundingMode.HALF_UP);
System.out.println(result);

打印結(jié)果:3.33,可以正常運(yùn)行。

因此,我們需要注意,在BigDecimal 做除法時(shí) ,必須指定精度。

3.用 equals 判斷相等

BigDecimal 的 equals 會(huì)比較 值和精度,這坑了不少人:

BigDecimal x = new BigDecimal("1.0");
BigDecimal y = new BigDecimal("1.00");

System.out.println(x.equals(y));

打印結(jié)果:false。

盡管 1.0 和 1.00 的數(shù)值相等,但精度不一樣,equals 判定為不同。

優(yōu)化方法,用 compareTo 比較數(shù)值:

例如:

System.out.println(x.compareTo(y) == 0);

打印結(jié)果:true

需要特別注意的地方是:我們?cè)谂袛鄡蓚€(gè)BigDecimal對(duì)象是否相等時(shí),應(yīng)該用 compareTo方法,別用 equals方法。

4.使用 scale 時(shí)忽視實(shí)際含義

有些小伙伴搞不清 scale(小數(shù)位數(shù))和 precision(總位數(shù))的區(qū)別,直接寫:

BigDecimal num = new BigDecimal("123.4500");
System.out.println(num.scale());

打印結(jié)果:4

但如果你寫成下面這樣的:

BigDecimal stripped = num.stripTrailingZeros();
System.out.println(stripped.scale());

打印結(jié)果卻是:1

scale 會(huì)發(fā)生變化,搞不好會(huì)影響后續(xù)計(jì)算。

那么,我們要如何優(yōu)化方法呢?

答:明確 scale 的含義。

如果要固定小數(shù)位,使用 setScale:

BigDecimal fixed = num.setScale(2, RoundingMode.HALF_UP);
System.out.println(fixed);

打印結(jié)果:123.45。

我們不要混淆 scale 和 precision,必要時(shí)顯式設(shè)置小數(shù)位數(shù)。

5.忽略不可變性

BigDecimal 是不可變的,但有些小伙伴會(huì)這樣寫:

BigDecimal sum = new BigDecimal("0");
for (int i = 0; i < 5; i++) {
    sum.add(new BigDecimal("1"));
}

打印結(jié)果:0

問題原因是 add 方法不會(huì)改變?cè)瓕?duì)象,而是返回一個(gè)新的 BigDecimal 實(shí)例。

那么,我們要如何優(yōu)化呢?

答:用變量接住返回值。

BigDecimal sum = new BigDecimal("0");
for (int i = 0; i < 5; i++) {
    sum = sum.add(new BigDecimal("1"));
}
System.out.println(sum);

打印結(jié)果是:5

BigDecimal 操作后需要接住新實(shí)例。

6.忽視性能問題

BigDecimal 是很精確,但也很慢。

如果大量計(jì)算時(shí)用 BigDecimal,會(huì)拖累性能,比如計(jì)算利息:

BigDecimal principal = new BigDecimal("10000");
BigDecimal rate = new BigDecimal("0.05");
BigDecimal interest = principal.multiply(rate);

一個(gè)循環(huán)里搞上百萬次,性能直接拉垮。

那么,這種情況我們又該如何優(yōu)化呢?

答:能用整數(shù)就用整數(shù)(比如分代替元)。

批量計(jì)算時(shí),用 double 計(jì)算,結(jié)果最后轉(zhuǎn)換成 BigDecimal。

double principal = 10000;
double rate = 0.05;
BigDecimal interest = BigDecimal.valueOf(principal * rate);
System.out.println(interest);

打印結(jié)果:500.00

參與大批量計(jì)算時(shí),兩個(gè)BigDecimal對(duì)象直接計(jì)算會(huì)比較慢,盡量少用,能優(yōu)化的地方別放過。

寫在最后

BigDecimal 是個(gè)非常強(qiáng)大的數(shù)字類工具,但也是個(gè)“細(xì)節(jié)狂魔”。

只有用對(duì)了,你才能真正享受它帶來的好處,否則就是自找麻煩。

希望這篇文章能幫到你,不要再踩坑。


責(zé)任編輯:武曉燕 來源: 蘇三說技術(shù)
相關(guān)推薦

2014-10-17 10:31:25

2015-05-14 14:24:27

互聯(lián)網(wǎng)IT從業(yè)者

2017-08-15 10:20:08

Surface微軟消費(fèi)者

2024-12-23 08:19:19

2016-12-02 13:01:54

Android 7.1安卓

2025-07-24 06:49:54

2022-04-26 09:53:30

WiFi網(wǎng)絡(luò)

2021-12-15 10:20:08

緩存架構(gòu)開發(fā)

2025-12-10 01:44:00

大模型AIKarpathy

2024-12-27 09:29:09

2024-06-27 08:36:12

Lodash對(duì)象類型isObject?

2014-12-15 15:33:25

Google測(cè)試馬桶

2018-01-09 20:53:13

2015-07-17 15:23:52

中國(guó)網(wǎng)

2024-09-09 11:11:45

2015-10-28 17:35:51

資本

2025-06-18 03:30:00

AI人工智能智能體

2025-09-05 08:15:51

2025-12-10 08:06:53

2025-10-23 11:56:45

點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)

国产香蕉精品| 亚洲精品一级二级三级| 国产精品视频九色porn| 粉嫩av一区二区三区天美传媒 | 国产欧美亚洲日本| 日韩一级精品视频在线观看| 开心丁香婷婷深爱五月| 91啪亚洲精品| 9色视频在线观看| 日韩爱爱小视频| 一区二区免费看| 91精品国产欧美一区二区18| 一级毛片在线| 欧美猛男做受videos| 欧美激情奇米色| 亚欧洲精品在线视频免费观看| 国产精品99视频| 91色在线视频| 欧美精品日本| 久久一区二区三区欧美亚洲| 亚洲欧洲日本mm| 欧美深深色噜噜狠狠yyy| 久久一区激情| 91精品一区二区三区四区| 国产成人三级在线观看| 2022中文字幕| 久久久99久久精品欧美| 男人艹女人在线观看| 亚洲国产成人精品视频| 欧美精品久久久久久久久久丰满| 欧美另类变人与禽xxxxx| 操你啦视频在线| 日韩av中文字幕在线播放| 亚洲综合在线电影| 色中色综合影院手机版在线观看| 亚洲丝袜啪啪| 99在线热播| 麻豆免费精品视频| 国产精品免费入口| 亚洲精品五月天| 日本ー区在线视频| 欧美精品丝袜中出| 麻豆乱码国产一区二区三区 | 青青草国产成人a∨下载安卓| 国产精品 欧美在线| 国产精品成人a在线观看| 精品国产二区在线| 国产在线一区观看| 免费黄色一级网站| 无吗不卡中文字幕| 国产蜜臀在线| 欧美精品精品精品精品免费| 天天综合精品| 男人j进女人j| 亚洲最新在线观看| 91精品国产91久久久久久青草| 在线视频免费一区二区| 国产一卡不卡| www.午夜色| 一区二区三区四区在线免费观看 | 丁香五月网久久综合| 国内精品伊人久久久久影院对白| 热久久精品免费视频| 在线一区二区三区四区| 欧美日韩大片| 成人精品一区二区三区电影免费 | 中文字幕亚洲在线观看| 91福利视频导航| 国产成人精品免费看| 18av网站| 日韩电影中文字幕| 精品午夜久久| 九一免费在线观看| 午夜精品久久久久久久蜜桃app| 免费毛片b在线观看| 2021国产精品视频| 日本网站在线观看一区二区三区| 日本黄大片一区二区三区| 欧美一区二区三区系列电影| 亚洲第一论坛sis| 一区二区冒白浆视频| 亚洲综合免费观看高清完整版在线| 悠悠资源网亚洲青| 51精品国产人成在线观看| 99国产精品一区| 久久精品视频观看| 国产成人精品一区二区| 成人午夜激情在线| www国产在线观看| 国产精品吹潮在线观看| 不卡av在线网| av电影免费在线看| 亚洲国产aⅴ成人精品无吗| 中文在线аv在线| 51成人做爰www免费看网站| 国产欧美一区二区三区在线看蜜臀| 欧美午夜大胆人体| 91精品国产综合久久香蕉的用户体验| 不卡一二三区首页| 色呦呦在线播放| 91精品在线一区| 欧美国产激情一区二区三区蜜月| 国产天堂在线播放视频| 99超碰麻豆| 亚洲成人av福利| 网曝91综合精品门事件在线| 国产欧美在线一区| 亚洲最新av在线网站| 日本午夜精品视频在线观看| 国产高清免费在线播放| 国产一区视频在线播放| 亚洲男人的天堂一区二区| 国产剧情一区二区在线观看| 久久综合亚洲精品| 欧美刺激午夜性久久久久久久| 欧美精品成人| 免费在线观看一级毛片| 91精品国产综合久久久久久蜜臀 | 4438x亚洲最大成人网| 婷婷另类小说| 国产黄色免费网| 91国内揄拍国内精品对白| 久久男人中文字幕资源站| 色是在线视频| 国产在线视频欧美一区二区三区| 久久草.com| 久久国产精品偷| 欧美一区二区不卡视频| 国产日产精品_国产精品毛片| 影音先锋成人资源网站| 欧美xingq一区二区| 久久久精品网| 中文字幕有码在线视频| 久久av一区二区三区亚洲| 欧美偷拍一区二区| 久草在线国产| 欧美精品激情视频| 亚洲国产高清不卡| 亚洲精品合集| 水莓100国产免费av在线播放| 亚洲一区二区中文| 日韩精品一级| 国产h视频在线播放| 日韩中文字幕免费看| 久久综合久色欧美综合狠狠| 亚洲精品一区二区三区在线| 国产高潮免费视频| 日韩美女免费视频| 一本久久综合亚洲鲁鲁五月天| 国产综合精品| www.色在线| 乱妇乱女熟妇熟女网站| 韩国19禁主播vip福利视频| 亚洲综合激情另类小说区| 欧美一区免费| av成人 com a| 妞干网在线免费视频| 国产ts人妖一区二区三区| 91久久线看在观草草青青| 日日夜夜精品免费视频| 日本一区二区三区中文字幕| av网站免费| 精品不卡在线| 正在播放欧美一区| 亚洲男同1069视频| 欧美激情五月| 在线天堂资源| 天天综合天天| 日韩精品一区二区三区swag| 国产乱码精品1区2区3区| eeuss在线观看| 久久久久久久久久久一区| 亚洲欧洲偷拍精品| 久久精品视频在线免费观看| 你微笑时很美电视剧整集高清不卡| 国产黄在线观看| 欧美少妇在线观看| 6080yy精品一区二区三区| 欧美日韩国产高清一区二区| 成人免费看黄yyy456| 成人一区不卡| 678在线观看视频| jizzjizzjizz亚洲女| 国产乱人伦精品一区二区| 日韩在线国产精品| 午夜精品一区二区三区三上悠亚 | 欧美一区第一页| 欧美一区二区在线免费播放 | 日韩欧美激情在线| 国产精品三级av| 丝袜诱惑制服诱惑色一区在线观看| 91精品国产乱码久久久竹菊| 97超碰资源站在线观看| 成人淫片免费视频95视频| 欧美一区激情视频在线观看| 91成品人片a无限观看| 亚洲精品成人久久| 欧美午夜宅男影院在线观看| 久久久蜜桃精品| 蜜臀久久99精品久久久画质超高清|