Java使用BigDecimal計算保留位數不對問題定位


在項目中使用BigDecimal計算將單位從B換成TB時,算出來的結果總是整數,而沒有保留設置的2位小數;

計算代碼如下:

db.divide(oneTB, ROUND_HALF_UP).setScale(2,ROUND_HALF_UP).doubleValue();  

代碼中指定了保留小數是2位,然后四舍五入,但是最后的結果總是整數,於是手動執行了下前面的divide部分,發現從divide的執行結果出來就是整數了,整數保留2位還是整數,小數當然沒有了,

查看divide函數源碼,代碼如下:

public BigDecimal divide(BigDecimal divisor, int roundingMode) {
        return this.divide(divisor, scale, roundingMode);
    }  

代碼中,執行divide函數時,默認給了一個本身的scale,這個scale的值是一開始你生成BigDecimal時賦的值,但是代碼中我並沒有專門在一開始賦值,

定義變量代碼如下:

BigDecimal db = new BigDecimal(b);
BigDecimal oneTB = new BigDecimal(1099511627776.0D);  

代碼中可以知道,一開始並沒有給db賦scale的變量值,於是查看了下構造函數,

發現有這么一塊代碼:

public BigDecimal(long val) {
        this.intCompact = val;
        this.intVal = (val == INFLATED) ? INFLATED_BIGINT : null;
        this.scale = 0;
    } 

原因找到了,我初始化的變量b是long型的,構造函數在你使用long型值初始化時,會默認將scale的值設置成0,如果你后續不專門指定scale的值的話,就相當於計算結果默認取整。

因為我后續計算時沒有指定scale的值,所以結果都是整數,在計算結果是整數的情況下,再設置保留2位也仍然會是整數,這就是結果保留位數不對的原因。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM