golang 浮點數精度問題

2021-09-22 12:25:36 字數 1378 閱讀 2981

把所有需要精確計算的資料先轉成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...