把所有需要精確計算的資料先轉成decimal,用decimal進行精確計算
1,兩個浮點數相加減,可能不準確
(1)相減
x := 74.96
y := 20.48
b := x - y
fmt.println(b) //output: 54.47999999999999
(2)相加
var a = 0.6
fmt.println(a + 0.7) //output: 1.2999999999999998
· 出現浮點數不精確的原因是,浮點數儲存至記憶體中時,2的-1、-2……-n次方不能精確的表示小數部分,所以再把這個數從位址中取出來進行計算就出現了偏差。
· 不是所有的float相加減乘除都一定出現偏差,具體要根據golang實現ieee 754的情況定。
2,float32和float64直接互轉會精度丟失, 四捨五入後錯誤
3,int64轉float64在數值很大的時候出現偏差
4,兩位小數乘100強轉int, 比期望值少了1
// case: float32==>float64
// 從資料庫中取出80.45, 歷史**用float32接收
var a float32 = 80.45
var b float64
// 有些函式只能接收float64, 只能強轉
b = float64(a)
// 列印出值, 強轉後出現偏差
fmt.println(a)
fmt.println(b)
// ... 四捨五入保留小數點後1位, 期望80.5, 結果是80.4
// case: int64==>float64
var c int64 = 987654321098765432
fmt.printf("%.f\n", float64(c)) //output:987654321098765440
// case: int(float64(xx.xx*100))
var d float64 = 1129.6
var e int64 = int64(d * 100)
fmt.println(e) //output:112959
浮點數精度問題
一 例子 首先我們去編譯器試試 double a 1.9 通過新增監視檢視a的值 會發現a的值是1.8999999 二 開始今天的學習 在最開始學c 的時候並沒有對浮點數進行很深入的學習,認為浮點不就是小數嘛,首先在c 的巨集裡面有 flt max 和 flt min 的定義,float是四位元組的...
浮點數精度丟失問題
c 中的浮點數,分單精度 float 和雙精度 double float 是 system.single 的別名,介於 3.402823e38 和 3.402823e38 之間的32位數字,符合二進位制浮點演算法的 iec 60559 1989 ieee 754 標準 double 是 system...
浮點數的精度問題
float 1bit 符號位 8bits 指數字 23bits 尾數字 double 1bit 符號位 11bits 指數字 52bits 尾數字 對於二進位制的小數 1.1 1 20 1 2 1 1 1 2 1.5 1.01 1 20 0 2 1 1 2 2 1 1 4 1.25 1.0011 1...