BigDecimal中要注意的一些事

2022-04-02 14:48:09 字數 1708 閱讀 1958

一、關於public bigdecimal(double val)

bigdecimal中三個主要的建構函式

1public bigdecimal(double val)

將double表示形式轉換為bigdecimal

不推薦2

public bigdecimal(int val)

將int表示形式轉換為bigdecimal推薦3

public bigdecimal(string val)

將字串表示形式轉換為bigdecimal

推薦

如果要**造成這個問題的原因其實和bigdecimal沒有關係;

原因:這其實和計算機使用二進位制編碼有關,在你使用bigdecimal(double val)傳入0.1時,這個0.1先被轉換為double,此時就已經出現了精度問題了,計算機只能用有限位數儲存小數【二進位制能用有限的位數表示的小數有:0.5、0.25、0.125 等】,所以儲存的小數大多為乙個近似值,十進位制的 0.1 轉為二進位制,得到乙個無限迴圈小數,所以傳入到bigdecimal(double val)中的數精度已經出現問題了,而bigdecimal又是為精確結果而設計的,所以bdouble就不是我們想要的0.1。

如何解決:

一、使用bigdecimal b1 = new bigdecimal("0.1");將資料轉成string再使用bigdecimal(string val);

二、使用bigdecimal b1 = bigdecimal.valueof(0.1);使用bigdecimal的valueof()方法;

開啟bigdecimal的valueof()的原始碼

可以看到它也是直接轉成string型別再呼叫bigdecimal(string val);方法

二、關於non-terminating decimal expansion; no exact representable decimal result

non-terminating decimal expansion; no exact representable decimal result.  翻譯為:非終止十進位制擴充套件; 沒有確切的可表示的小數結果;

翻譯為人話就是說:bigdecimal是為高精度計算而設計的,而你的值是沒有精確結果的;

舉例:

1.0/3.0是除不盡的,所以丟擲異常

解決方案:使用bigdecimal.divide(bigdecimal divisor, int scale, roundingmode roundingmode) ;

其中   scale  為保留的小數字;roundingmode roundingmode 為取捨模式(如:roundingmode.half_up 四捨五入);

roundingmode具有哪些模式請參照我的另一篇部落格:

set中要注意的問題

include include includeusing namespace std seta set iterator it,it1 int main else i 0 for it a.begin it a.end it cout endl set中若erase了迭代器,迭代器就消失了,因此我用...

angular中要注意的指令

1.ng repeat 遍歷集合,給每個元素生成模板例項,每個例項的作用域中可以用一些特殊屬性,如下 1 index 遍歷集合的下標 2 first 遍歷集合中的第乙個物件 3 last 遍歷集合中的最後乙個物件 4 middle 遍歷集合第乙個和最後乙個之間的物件 5 even 遍歷集合的偶數物件...

Ajax中要注意的問題

ajax呼叫的返回資料會被快取,呼叫靜態html 即使把html修改了,ie依有可能然用原來的資料顯示。而firefox可以正常顯示新的資料。解決辦法 prototype的get中,設定 pars mod readarticle fid f fid rand math.random 使用j a提供的...