国产片侵犯亲女视频播放_亚洲精品二区_在线免费国产视频_欧美精品一区二区三区在线_少妇久久久_在线观看av不卡

服務(wù)器之家:專注于服務(wù)器技術(shù)及軟件下載分享
分類導(dǎo)航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術(shù)|正則表達(dá)式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務(wù)器之家 - 編程語言 - Java教程 - Java中BigDecimal除法使用不當(dāng)導(dǎo)致精度問題

Java中BigDecimal除法使用不當(dāng)導(dǎo)致精度問題

2022-03-09 00:56一灰灰 Java教程

本文主要介紹了Java中BigDecimal除法使用不當(dāng)導(dǎo)致精度問題,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下

在使用BigDecimal的除法時(shí),遇到一個(gè)鬼畜的問題,本以為的精度計(jì)算,結(jié)果使用返回0,當(dāng)然最終發(fā)現(xiàn)還是使用姿勢不對導(dǎo)致的,因此記錄一下,避免后面重蹈覆轍

I. 問題拋出

在使用BigDecimal做高精度的除法時(shí),一不注意遇到了一個(gè)小問題,如下

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
@Test
public void testBigDecimal() {
    BigDecimal origin = new BigDecimal(541253);
    BigDecimal now = new BigDecimal(12389431);
 
    BigDecimal val = origin.divide(now, RoundingMode.HALF_UP);
    System.out.println(val);
 
    origin = new BigDecimal(541253);
    now = new BigDecimal(12389431.3);
    val = origin.divide(now, RoundingMode.HALF_UP);
    System.out.println(val);
 
    origin = new BigDecimal(541253.4);
    now = new BigDecimal(12389431);
    val = origin.divide(now, RoundingMode.HALF_UP);
    System.out.println(val);
}

上面的輸出是什么 ?
0
0
0.043686703610520937021487456961257

為什么前面兩個(gè)會是0呢,如果直接是 541253 / 12389431 = 0 倒是可以理解, 但是BigDecimal不是高精度的計(jì)算么,講道理不應(yīng)該不會出現(xiàn)這種整除的問題吧

我們知道在BigDecimal做觸發(fā)時(shí),可以指定保留小數(shù)的參數(shù),如果加上這個(gè),是否會不一樣呢?

?
1
2
3
4
5
BigDecimal origin = new BigDecimal(541253);
BigDecimal now = new BigDecimal(12389431);
 
BigDecimal val = origin.divide(now, 5, RoundingMode.HALF_UP);
System.out.println(val);

輸出結(jié)果為:
0.04369

所以說在指定了保留小數(shù)之后,則沒有問題,所以大膽的猜測一下,是不是上面的幾種case中,由于scale值沒有指定時(shí),默認(rèn)值不一樣,從而導(dǎo)致最終結(jié)果的精度不同呢?

簡單的深入源碼分析一下,執(zhí)行的方式為 origin.divide(now, RoundingMode.HALF_UP);, 所以這個(gè)scale參數(shù)就瞄準(zhǔn)origin對象,而這個(gè)對象,就只能去分析它的構(gòu)造了,因?yàn)闆]有其他的地方使用

II. 源碼定位

1. 整形傳參構(gòu)造

分析下面這一行, 直接進(jìn)入源碼

?
1
BigDecimal origin = new BigDecimal(541253);

很明顯的int傳參構(gòu)造,進(jìn)去簡單看一下

?
1
2
3
4
5
6
7
8
9
10
11
12
// java.math.BigDecimal#BigDecimal(int)
public BigDecimal(int val) {
    this.intCompact = val;
    this.scale = 0;
    this.intVal = null;
}
 
public BigDecimal(long val) {
    this.intCompact = val;
    this.intVal = (val == INFLATED) ? INFLATED_BIGINT : null;
    this.scale = 0;
}

so,很明確的知道默認(rèn)的scale為0,也就是說當(dāng)origin為正數(shù)時(shí),以它進(jìn)行的除法,不現(xiàn)實(shí)指定scale參數(shù)時(shí),最終返回的都是沒有小數(shù)的,同樣看一眼,還有l(wèi)ong的傳參方式, BigInteger也一樣

2. 浮點(diǎn)傳參

接下來就是浮點(diǎn)的scale默認(rèn)值確認(rèn)了,這個(gè)構(gòu)造相比前面的復(fù)雜一點(diǎn),源碼就不貼了,太長,也看不太懂做了些啥,直接用猥瑣一點(diǎn)的方式,進(jìn)入debug模式,單步執(zhí)行

?
1
2
3
4
5
6
@Test
public void testBigDecimal() {
    BigDecimal origin = new BigDecimal(541253.0);
    BigDecimal now = new BigDecimal(12389431.1);
    BigDecimal tmp = new BigDecimal(0.0);
}

根據(jù)debug的結(jié)果,第一個(gè),scale為0; 第二個(gè)scale為29, 第三個(gè)scale為0

Java中BigDecimal除法使用不當(dāng)導(dǎo)致精度問題

Java中BigDecimal除法使用不當(dāng)導(dǎo)致精度問題

Java中BigDecimal除法使用不當(dāng)導(dǎo)致精度問題

3. String傳參

依然是一大串的邏輯,同樣采用單步debug的方式試下

?
1
2
3
4
5
6
@Test
public void testBigDecimal() {
    BigDecimal origin = new BigDecimal("541253.0");
    BigDecimal now = new BigDecimal("12389431.1");
    BigDecimal t = new BigDecimal("0.0");
}

上面三個(gè)的scale都是1

4. 小結(jié)

對于BigDecimal進(jìn)行除法運(yùn)算時(shí),最好指定其scale參數(shù),不然可能會有坑
對于BigDecimla的scale初始化的原理,有待深入看下BigDecimal是怎么實(shí)現(xiàn)的

最后貼一張乘法的圖作為收尾

Java中BigDecimal除法使用不當(dāng)導(dǎo)致精度問題

到此這篇關(guān)于Java中BigDecimal除法使用不當(dāng)導(dǎo)致精度問題的文章就介紹到這了,更多相關(guān)Java BigDecimal除法精度內(nèi)容請搜索服務(wù)器之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持服務(wù)器之家!

原文鏈接:https://juejin.cn/post/7025607161883394079

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 日韩视频在线一区 | 天天摸天天干 | av网站免费看 | 日韩在线免费观看视频 | 国产大片一区 | 欧美另类专区 | 亚洲wu码 | 色啪网站 | 男人的天堂久久 | 欧美日韩高清在线观看 | 日韩欧美一区二区三区久久婷婷 | 色综合天天天天做夜夜夜夜做 | 一级全黄少妇性色生活片免费 | 国产欧美日本 | 久久中文字幕一区二区三区 | 福利久久| 国产成人精品久久二区二区 | 成人精品鲁一区一区二区 | 国产羞羞视频在线观看 | 一区二区在线视频 | 一区二区三区av | 亚洲在线看| 中文视频一区 | 国产精品国产精品国产专区不片 | 国产精品一区二区不卡 | 国产理论在线 | 国产精品美女 | 国产高清在线精品一区二区三区 | 欧美日韩成人一区二区 | 爱逼色 | 天天操天天干天天插 | 欧美福利在线 | 日日操视频| 久久99精品视频 | 久久亚洲天堂 | 人人干人人爱 | 国产精品免费久久 | 91精品国产高清久久久久久久久 | 久久综合影院 | 久久xxx| 亚洲精品久久一区二区三区 |