簡體   English   中英

Golang將float64轉換為int錯誤

[英]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

你從中減去100float64(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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM