[英]Golang converting float64 to int error
在將float轉換為int時,如何避免浮點錯誤。 例如,以下代碼打印: 0.5499999999999972
當我傷口期望它打印0.55
。
package main
import "fmt"
func main() {
x := 100.55
fmt.Println(x - float64(int(x)))
}
Output:
0.5499999999999972
你需要理解一些東西: 100.55
是十進制數(以十進制基數表示)。 十進制中的100.55
是有限數,恰好是這個: 100.55
。
計算機一般以二進制表示存儲數字。 數字100.55
不能用有限二進制數表示: 100.55
是二進制表示中的無窮數(同樣的原因,為什么1/3
不能用有限的十進制數表示,它是無窮無盡的序列: 0.333333333....
)。
但Go(與任何其他語言一樣)使用IEEE-754標准存儲float64
類型,這是一種有限二進制表示。 float64
值使用內存中的64位來描述數字,其中53位用於描述數字,11位用於指數。
現在當你“說”這個:
x := 100.55
它是一個簡短的變量聲明 ,它將創建一個名為x
的新變量,並從右側表達式推斷其類型,這是一個浮點字面值,因此Go規范x
的類型將是float64
。 浮點文字必須被“轉換”才能用64位表示(由IEEE-754
規定的規則)。 並且由於100.55
將要求無限位以二進制基數精確表示,通過僅使用64位(數字為53),結果將不會(不能)正好為100.55
(但是IEEE-754格式中的64位二進制數字最接近它),這是:
x := 100.55
fmt.Printf("%.50f\n", x)
100.54999999999999715782905695959925651550292968750000
所以你已經開始使用不是100.55
。
你從中減去100
( float64(int(x))
將正好是100.0
):
x = x - float64(int(x))
fmt.Printf("%.50f\n", x)
0.54999999999999715782905695959925651550292968750000
你能為這個做什么? 真的沒什么。 您期望的結果( 0.55
)在二進制表示中也是無限數,因此在float64
類型的變量中不能具有0.55
的精確數。
您可以做的是正常使用數字,但是當您打印它時,將其四舍五入到您選擇的小數位。 最簡單的方法是使用fmt.Printf()
,並使用動詞%f
指定格式字符串,包括精度:
fmt.Printf("%.2f\n", x)
結果:
0.55
另一種選擇是避免使用浮點數。 例如,如果您要代表美元金額,您可以將所有值“乘以” 100
並將金額表示為美分(1 $ * 100),這是一個整數。 只有當您需要將結果打印為USD時,才能打印出類似的內容
cents := 10055
fmt.Printf("%d.%d $", cents/100, cents%100)
輸出:
100.55 $
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.