gpt4 book ai didi

Golang 将 float64 转换为 int 错误

转载 作者:IT王子 更新时间:2023-10-29 00:55:46 30 4
gpt4 key购买 nike

在将 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

这是一个short variable declaration这将创建一个名为 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

另一种选择是避免使用 float 。例如。如果您要表示美元金额,您可以将所有值“乘以”100,并将金额表示为美分 (1$*100),这是一个整数。仅当您需要将结果打印为 USD 时,您才可以打印类似

的内容
cents := 10055
fmt.Printf("%d.%d $", cents/100, cents%100)

输出:

100.55 $

关于Golang 将 float64 转换为 int 错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36052922/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com