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


前言

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

方法分析

當前能想到的比較容易有下面幾種
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

 


免責聲明!

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



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