1. 程式人生 > >java如何獲取一個double的小數位數

java如何獲取一個double的小數位數

spl for value 字符 小數 容易 its google 客戶

前言

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

方法分析

當前能想到的比較容易有下面幾種
1、直接使用double處理
2、將double轉換成String進行處理

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

    public static int getNumberDecimalDigits(double number) {
        if (number == (long)number) {
            
return 0; } int i = 0; while (true){ i++; if (number * Math.pow(10, i) % 1 == 0) { return i; } } }

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

public static
int getNumberDecimalDigits(double number) { String moneyStr = String.valueOf(number); String[] num = moneyStr.split("\\."); if (num.length == 2) { for (;;){ if (num[1].endsWith("0")) { num[1] = num[1].substring(0, num[1].length() - 1); }
else { break; } } return num[1].length(); }else { return 0; } }

測試方法:

public static void main(String[] args) {
    System.out.print(getNumberDecimalDigits(0));
    System.out.print(" " + getNumberDecimalDigits(0.0));
    System.out.print(" " + getNumberDecimalDigits(1));
    System.out.print(" " + getNumberDecimalDigits(-11.1));
    System.out.print(" " + getNumberDecimalDigits(1.01));
    System.out.print(" " + getNumberDecimalDigits(0.0100));
    System.out.print(" " + getNumberDecimalDigits(0.123456));
    System.out.print(" " + getNumberDecimalDigits(11111111.1234));
    System.out.print(" " + getNumberDecimalDigits(11.0123456789));
}

結果分析

測試結果:
方法一: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

如果你有更好的方法,能通過上面的測試,那趕緊評論讓我膜拜膜拜~

國外問題提出和解決:
https://stackoverflow.com/questions/6264576/number-of-decimal-digits-in-a-double?utm_medium=organic&utm_source=google_rich_qa&utm_campaign=google_rich_qa

java如何獲取一個double的小數位數