回覆列表
-
1 # 網路圈
-
2 # zhangyiant
不單單是.net,任何語言只要用浮點數都會有這樣的問題,可以研究一下浮點數在計算機裡面的儲存方式,就能明白這麼玩一定會在某些情況丟失精度。所以如果你的運算是不能丟失精度的,比如說貨款價格,你就要想想該用什麼資料了,如果用浮點,精度時候夠。這就是為什麼程式設計裡面資料結構很重要的原因。
不單單是.net,任何語言只要用浮點數都會有這樣的問題,可以研究一下浮點數在計算機裡面的儲存方式,就能明白這麼玩一定會在某些情況丟失精度。所以如果你的運算是不能丟失精度的,比如說貨款價格,你就要想想該用什麼資料了,如果用浮點,精度時候夠。這就是為什麼程式設計裡面資料結構很重要的原因。
對於開發者而言,或多或少都聽前輩們提及過:不要對浮點數進行比較!其實不管是什麼程式語言,只要涉及到浮點數的加減乘除運算,其結果都會偏離預期!這一點應該作為常識銘記於心。
浮點數存在精度丟失現象不管是單精度浮點數還是雙精度浮點數,它們都無法精確表示數值。任何資料在計算機中都是以二進位制儲存的,二進位制浮點數並不能精確表示類似0.5這樣的小數,通俗的說就是:小數的二進位制並不一定是精確的(比如說十進位制不能精確表示1/3,同理二進位制也不能精確表示1/3)。
一個小數要進入計算機中要經過幾個步聚:
Step1:轉換為二進位制
Step2:用二進位制科學計算法表示
Step3:表示成IEEE 754形式(幾乎所有程式語言的浮點數都是採用IEEE標準的)
在第一步和第三步時,都會存在丟失精度的可能,然後再將兩個浮點數進行數學運算,結果會更加偏離預期。
浮點數精度丟失解決方案特別是在金融類專案中,不可避免會出現一些小數,此時我們絕對要禁止使用浮點數來表示這些小數,而應該改為Decimal庫來儲存小數。