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