在項目中使用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位也仍然會是整數,這就是結果保留位數不對的原因。