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

BigDecimal為什么可以不丟失精度?

開發 前端
在金融領域,為了保證數據的精度,往往會使用BigDecimal。本文就來探討下為什么BigDecimal可以保證精度不丟失。

在金融領域,為了保證數據的精度,往往會使用BigDecimal。本文就來探討下為什么BigDecimal可以保證精度不丟失。

類介紹

首先來看一下BigDecimal的類聲明以及幾個屬性:

public class BigDecimal extends Number implements Comparable<BigDecimal> {
    // 該BigDecimal的未縮放值
    privatefinal BigInteger intVal;
    // 精度,可以理解成小數點后的位數
    privatefinalint scale;
    // BigDecimal中的十進制位數,如果位數未知,則為0(備用信息)
    privatetransientint precision;
    // Used to store the canonical string representation, if computed.
    // 這個我理解就是存實際的BigDecimal值
    privatetransient String stringCache;
    // 擴大成long型數值后的值
    privatefinaltransientlong intCompact;
}

從例子入手

通過debug來發現源碼中的奧秘是了解類運行機制很好的方式。請看下面的testBigDecimal方法:

@Test
public void testBigDecimal() {
    BigDecimal bigDecimal1 = BigDecimal.valueOf(2.36);
    BigDecimal bigDecimal2 = BigDecimal.valueOf(3.5);
    BigDecimal resDecimal = bigDecimal1.add(bigDecimal2);
    System.out.println(resDecimal);
}

在執行了BigDecimal.valueOf(2.36)后,查看debug信息可以發現上述提到的幾個屬性被賦了值:

圖片圖片

接下來進到add方法里面,看看它是怎么計算的:

/**
 * Returns a BigDecimal whose value is (this + augend), 
 * and whose scale is max(this.scale(), augend.scale()).
 */
public BigDecimal add(BigDecimal augend) {
    if (this.intCompact != INFLATED) {
        if ((augend.intCompact != INFLATED)) {
            return add(this.intCompact, this.scale, augend.intCompact, augend.scale);
        } else {
            return add(this.intCompact, this.scale, augend.intVal, augend.scale);
        }
    } else {
        if ((augend.intCompact != INFLATED)) {
            return add(augend.intCompact, augend.scale, this.intVal, this.scale);
        } else {
            return add(this.intVal, this.scale, augend.intVal, augend.scale);
        }
    }
}

看一下傳進來的值:

圖片圖片

進入上面代碼塊第8行的add方法:

private static BigDecimal add(final long xs, int scale1, final long ys, int scale2) {
    long sdiff = (long) scale1 - scale2;
    if (sdiff == 0) {
        return add(xs, ys, scale1);
    } elseif (sdiff < 0) {
        int raise = checkScale(xs,-sdiff);
        long scaledX = longMultiplyPowerTen(xs, raise);
        if (scaledX != INFLATED) {
            return add(scaledX, ys, scale2);
        } else {
            BigInteger bigsum = bigMultiplyPowerTen(xs,raise).add(ys);
            return ((xs^ys)>=0) ? // same sign test
                new BigDecimal(bigsum, INFLATED, scale2, 0)
                : valueOf(bigsum, scale2, 0);
        }
    } else {
        int raise = checkScale(ys,sdiff);
        long scaledY = longMultiplyPowerTen(ys, raise);
        if (scaledY != INFLATED) {
            return add(xs, scaledY, scale1);
        } else {
            BigInteger bigsum = bigMultiplyPowerTen(ys,raise).add(xs);
            return ((xs^ys)>=0) ?
                new BigDecimal(bigsum, INFLATED, scale1, 0)
                : valueOf(bigsum, scale1, 0);
        }
    }
}

這個例子中,該方法傳入的參數分別是:xs=236scale1=2ys=35scale2=1

該方法首先計算scale1 - scale2,根據差值走不同的計算邏輯,這里求出來是1,所以進入到最下面的else代碼塊(這塊是關鍵):

首先17行校驗了一下數值范圍

18行將ys擴大了10的n次倍,這里n=raise=1,所以返回的scaledY=350

接著就進入到20行的add方法:

private static BigDecimal add(long xs, long ys, int scale){
    long sum = add(xs, ys);
    if (sum!=INFLATED)
        return BigDecimal.valueOf(sum, scale);
    return new BigDecimal(BigInteger.valueOf(xs).add(ys), scale);
}

這個方法很簡單,就是計算和,然后返回BigDecimal對象:

圖片圖片

結論

所以可以得出結論:BigDecimal在計算時,實際會把數值擴大10的n次倍,變成一個long型整數進行計算,整數計算時自然可以實現精度不丟失。同時結合精度scale,實現最終結果的計算。

責任編輯:武曉燕 來源: 碼猿技術專欄
相關推薦

2024-10-25 14:39:26

BigDecimal精度數值

2021-03-08 10:19:59

MQ消息磁盤

2020-03-27 16:05:49

數據庫數據MySQL

2024-03-11 11:02:03

Date類JavaAPI

2016-10-11 16:31:56

微信服務器消息

2022-01-11 10:29:32

Docker文件掛載

2024-11-29 08:20:22

Autowired場景項目

2013-03-13 03:58:12

馬云人大代表兩會

2011-06-16 15:29:22

2024-12-06 08:20:22

BigDecimal浮點數初始化

2011-11-23 13:04:19

Java高精度BigDecimal

2022-08-24 10:58:31

數據丟失數據丟失防護

2023-12-13 10:36:38

Long算法代碼

2025-12-12 01:22:00

BigDecimalJava 開發函數

2020-04-01 17:50:02

Python編程語言

2024-02-21 21:28:29

Linux系統

2013-09-03 15:20:49

創業日本人創業

2021-03-03 08:32:43

集成晶振MCU

2024-11-12 10:30:54

Docker部署數據庫

2025-09-03 00:05:00

WebSocket微信釘釘
點贊
收藏

51CTO技術棧公眾號

www.99.热| 小处雏高清一区二区三区| 欧美一区二区精品久久911| 国产在线视频网址| 欧美狂野另类xxxxoooo| gogo在线观看| 日韩av在线免费播放| 天堂电影一区| 丝袜情趣国产精品| 国产suv精品一区| 国产成人在线一区| 欧美日韩一区二区高清| 欧美一区二区三区在线免费观看 | 91社区在线观看| 精品久久国产97色综合| 激情亚洲小说| 国产成人av在线| 99精品免费视频| 91视频成人免费| 国产精品久久久99| av在线1区2区| 丝袜美腿精品国产二区| 午夜天堂精品久久久久| 色婷婷亚洲婷婷| 欧美a级在线观看| 26uuu亚洲伊人春色| 最新日韩在线| 国产亚洲黄色片| 一区二区三区四区在线播放 | 欧美日韩中文字幕在线播放| 国产精品系列在线| 免费观看久久久久| 色偷偷91综合久久噜噜| 国产精品99在线观看| 男人添女人下部视频免费| 亚洲乱码日产精品bd| 爱情岛亚洲播放路线| 91精品国产91久久久久福利| 久久久999| 韩国版免费三体| 亚洲美女又黄又爽在线观看| 国产精品一在线观看| 日韩精品一区二区三区电影| 亚洲成人资源网| 欧美一区 二区 三区| 91丨九色丨国产在线| 91免费观看视频| 97超碰资源站在线观看| 国产999精品久久久| 精品一区二区三区在线观看| 午夜视频国产| 久久久精品久久久| 久热精品在线| 最新av在线网站| 欧美剧在线观看| 天堂资源在线中文精品| h色视频在线观看| 中文字幕日韩有码| 日韩精品电影在线| 每日更新av在线播放| 26uuu另类亚洲欧美日本一| 美国三级日本三级久久99| 欧美精品一区二区三区涩爱蜜| 色妞色视频一区二区三区四区| 夜夜嗨一区二区| bdsm精品捆绑chinese| 欧美精品中文字幕一区| 国内精品久久久久影院一蜜桃| 国产视频精品久久| 欧美亚洲激情在线| 91麻豆福利精品推荐| 在线亚洲人成| 日韩福利二区| 欧美日韩三级视频| 欧美1区视频| 一个人免费视频www在线观看| 91av视频在线播放| 久久亚洲影视婷婷| 欧美日韩国产网站| 亚洲小说欧美另类激情| 91精品国产色综合久久久蜜香臀| 成人羞羞在线观看网站| www.1024| 九九热精品在线| 成人午夜电影网站| 人人视频精品| 成人黄色大片网站| 一区二区国产精品视频| 激情久久五月天| 中文字幕成在线观看| 国产福利片一区二区| 精品成人免费观看| 日韩激情视频在线观看| 91国内在线| 中文字幕一区综合| 日韩精品在线视频美女| 狠狠色伊人亚洲综合成人| 亚洲天堂资源| 男女猛烈激情xx00免费视频| 北条麻妃在线一区二区| 91视视频在线观看入口直接观看www | 男人天堂久久久| 91在线视频精品| 欧美日韩激情网| 欧美日韩亚洲国产精品| 91大神在线网站| 日韩av电影在线观看| 亚洲国产天堂久久国产91 | 超碰在线公开97| 午夜精品蜜臀一区二区三区免费| 国产精品视频九色porn| 伊人久久大香线蕉综合网蜜芽| 国产成人综合美国十次| 国产成人综合久久| 日韩欧美国产骚| 国内自拍视频一区二区三区 | 亚洲欧美春色| 成人bbav| 秋霞无码一区二区| 久久久之久亚州精品露出| 亚洲无线码一区二区三区| 亚洲人成免费网站| 欧美日韩色网| 免费无码国产v片在线观看| 欧美在线中文字幕| 91极品美女在线| 国精产品一区一区三区mba桃花 | 午夜啪啪福利视频| 中文字幕亚洲综合久久| 国产蜜臀97一区二区三区| 九九综合久久| 91大神在线网站| 国产精品无码电影在线观看| 久久久免费电影| 欧美日韩精品国产| 奇米影视一区二区三区小说| 99热这里有精品| 最新在线你懂的| 亚洲毛片aa| 久久久久久久av| 欧美在线一二三| 国产99久久久精品| av成人资源| 麻豆网站视频在线观看| www.avtt| 国产精品久久久久久久一区探花| 欧美日韩精品欧美日韩精品| 成人av高清在线| 天天做天天爱天天爽综合网| 亚洲小说区图片| 日本999视频| 国产一级精品aaaaa看| www.日韩.com| 日韩欧美在线观看| 国产高清精品网站| 99精品在线观看| 九七电影院97理论片久久tvb| 中文字幕在线免费播放| 免费cad大片在线观看| 国产情人节一区| 中文字幕精品在线视频| 日韩欧美大尺度| 99久久国产综合精品麻豆| 国产精品99一区二区| 99精品美女视频在线观看热舞| 国产资源在线播放| 干日本少妇首页| 欧美一级日本a级v片| 欧洲s码亚洲m码精品一区| 日韩精品一区二区三区swag| 亚洲情趣在线观看| 国产99久久久国产精品潘金| 黑丝一区二区| 久久国产精品免费精品3p| 日韩三级免费| 精品国产一区二区三区四区阿崩| 日本中文字幕网址| 蜜桃av噜噜一区二区三| 欧美在线视频免费观看| 中文字幕欧美视频在线| 91精品国产综合久久久久久久久久| 亚洲人亚洲人成电影网站色| 国产美女精品一区二区三区| 亚洲调教视频在线观看| 亚洲资源网你懂的| 日韩电影精品| 日本精品600av| 亚洲日本高清| 男女羞羞视频网站| 一区二区三区视频| 国产成人综合av| 一区二区三区av在线| 偷窥自拍亚洲色图| 国产精品久久久久久妇女| 日韩电影一区二区三区四区| 欧美性猛交xxxxxx富婆| 国产精品视频网站在线观看| 欧美性suv| 色先锋久久av资源部| 国产欧美日韩一区二区三区|