java如何獲取乙個double的小數字數

2021-09-07 18:04:07 字數 1291 閱讀 6342

看標題是不是覺得這是乙個很簡單的問題,我一開始也是這麼認為的,但是實際情況下,在各種情況下我們都進行了測試,發現很多實際情況是無法不盡如人意的。

當前能想到的比較容易有下面幾種

1、直接使用double處理

2、將double轉換成string進行處理

方法一:直接對double進行處理,進行計算通過計算後的結果進行取模操作獲取小數字數,如下:

public

static

int getnumberdecimaldigits(double

number)

int i = 0;

while (true

) }

}

方法二:將double轉換成string後,然後利用「.」分割進行判斷,如下:(這裡double轉換string有多種方式這裡我們選擇其中的一種)

public

static

int getnumberdecimaldigits(double

number)

else

}return num[1].length();

}else

}

測試方法:

public

static

void

main(string args)

測試結果:

方法一:0 0 0 1 2 2 6 5 11

方法二:0 0 0 1 2 2 6 13 10

為什麼最後的結果和我們想象不一樣呢???

原因有三個:

1、double計算丟失精度:

2.01 * 10 = 20.099999999999998

2、double轉string丟失精度:

string.valueof(11111111.1234) = 1.11111111234e7

11111111.1234 + "" = 1.11111111234e7

double.valueof(11111111.123) = 1.1111111123e7

...所以在當前情況下,只要使用double進行判斷都會出現各種各樣的問題,因為double精度的問題。

所以唯一能解決的辦法就是,不要使用double,直接使用字串,無論是從客戶端傳入的值還是生產的值都是直接使用字串進行處理和判斷,判斷方法與方法二類似。

如果非要進行計算,請使用bigdecimal進行計算。new bigdecimal的時候注意一定要使用字串作為引數進行new

國外問題提出和解決:

如何獲取乙個型別引用

原著 andrew troelsen pro c 2008 and the net 3.5 platform,fourth edition system.type 類定義了一些成員,可以用來檢視某個型別的元資料,其中很多成員都返回system.reflection名字空間中的型別。例如,type.g...

jquery如何獲取第乙個或最後乙個子元素?

通過children方法,children input first child 12 this children input first child val this children input last child val 通過 選擇器,items input first 在這裡轉一篇 jque...

乙個有趣的問題 如何獲取引用名

我們知道,對於 a 100 這樣的一條語句,a是乙個指向 100 這個物件的引用.那麼,如何根據a得到它的名字 a 或者符號 a 我現在實現了乙個 swap 函式,它的作用是交換兩個變數的值,由於ruby沒有類似c的 指標 所以這個swap實現起來還真有點麻煩 a 100 b 200 def swa...