天天看點

go語言之浮點數

go語言擁有兩種浮點類型,一種是float64,每個64位的浮點數需要占用8位元組,另一種是float32,占用4位元組。

var p = 3.54
fmt.Printf("%T",p)      

輸出float64,也就是預設浮點數是float64,如果想定義float32,需要明确指定。

如果不為float64指派,預設就是0.0。

下面的浮點數的格式化輸出,%4.2f中4代表總寬度,這裡需要注意,點也算寬度。2代表小數點後面有2位。%.3f是總寬度沒有說明,隻說明小數點後有3位。如果隻有2位,那最後一位用0補充。

abc := 1.0 / 3
fmt.Println(abc)
fmt.Printf("%.3f\n", abc)
fmt.Printf("%4.2f\n", abc)      

浮點數的計算會出現精度問題,雖然可以精确的辨別1/3,但是在使用這個數字和其他數字進行計算的時候卻會引發舍入錯誤。

abc := 1.0 / 3
fmt.Println(abc + abc + abc)  //輸出1
aaa := 0.1
bbb := aaa + 0.2
fmt.Println(bbb) //0.30000000000000004      

浮點數不是表示金錢的最佳選擇。解決這一問題的另一種做法是使用整數類型存儲分。不過一般來說擷取2位小數基本還是正确的。還有一個技巧,把乘法計算放到除法計算的前面執行,這樣做法通常會得到更為精确的計算結果。

ceshi := 16.0
fmt.Println(ceshi / 5.0 * 3.0)  //9.600000000000001
fmt.Println(ceshi * 3.0 / 5.0)  //9.6      
aaa := 0.1
bbb := aaa + 0.2
fmt.Println(bbb)
fmt.Println(bbb == 0.3)  //false
fmt.Println(math.Abs(bbb-0.3) < 0.0001)   //true