奇怪的Double運算

2022-09-08 12:27:15 字數 1050 閱讀 7098

今天測試同學反饋有乙個執行了很久的程式,最近的崩潰率很高,通過日誌查詢發現,這是乙個查詢進度的介面,進度結果的精度是小數點後兩位。

但是日誌中卻有很多的超過這個精度的結果,簡化了一下**:

1

double progress = 0.07000000000001d;

2 decimalformat df = new decimalformat("0.00");

3 string value =df.format(progress);

4if (progress > 0 && progress <= 1)

這裡首先是將progress的精度轉換為小數點後兩位,然後再進行乘以100 ,目的是為了轉換成100%的結果,但是執行起來結果卻和我們預期的不一樣。

這裡我們通過斷點的方式可以看到,轉換完之後的progressresult竟然又恢復到了原來的精度。

這是因為在計算機的內部是通過二進位製碼來進行計算的,我們看到的double的值可能是0.1,但是實際情況可能是0.100000000000000001,因為要展示這個數字是需要再從二進位制數轉回成十進位制的,所以後面的內容就無法正確的顯示。但是仍然是真是存在的。所以我們雖然前面已經通過format的方式將progress的精度調整了,但是後面的位數還是存在的,所以在乘以100之後,結果就變成了現在的結果。所以在程式中,如果有double或者是float的值進行計算的,一定要使用bigdecimal來進行正確的處理。

下面是正確的處理方式:

1

double progress = 0.07000000000001d;

2 decimalformat df = new decimalformat("0.00");

3 string value =df.format(progress);

4if (progress > 0 && progress <= 1)

double型別運算異常

對於兩個double型別的數值運算,有時會出現結果值異常的情況。看如下 public class doubletest 對於以上的四則運算,我們可以很容易的計算出結果39.99,0.34,3.3 0.123,然而計算機執行結果如下 j a中的簡單浮點數型別float和double不能夠進行運算,因為...

python奇怪的運算規則

今天做了乙個題,輸入乙個數,然後將其反轉,比如123 轉成321,123轉成 321 這題本來用c 寫就幾句話 class solution return res 但是如果用python這樣寫就成了死迴圈 class solution return an integer def reverse se...

double與float運算上的坑

一 double乘法坑 public static void main string args 執行結果 驚不驚喜?意不意外?7156 7157二 除法喜歡加f的群眾 public static void main string args 執行結果 開不開心?尾數0加了f 225456.00 尾數1...