当前位置: 首页 > 面试题库 >

Golang将float64转换为int错误

谢承颜
2023-03-14
问题内容

将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(像其他语言一样)float64使用IEEE-754标准存储类型,IEEE-754标准是一种有限的
二进制 表示形式。甲float64值使用64个比特在存储器来描述的53位被用于描述数字和11位被用于指数的数量,。

现在,当您“说”这一点时:

x := 100.55

这是一个简短的变量声明,它将创建一个名为的新变量,x并从右侧表达式(其为浮点文字)推断类型,因此Go
spec 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)也是二进制表示形式的无限数,因此0.55类型type的变量中不能有确切的数目float64

您可以正常使用数字,但是在打印时,将其四舍五入到您选择的小数位。最简单的方法是使用fmt.Printf(),并使用%f包括精度的动词指定格式字符串:

fmt.Printf("%.2f\n", x)

结果:

0.55

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

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

输出:

100.55 $


 类似资料:
  • 问题内容: 如何在Go中将float64转换为int?我知道该包可用于在字符串之间进行任何转换,但不能用于不是字符串的数据类型之间的转换。我知道我可以使用将任何内容转换为字符串,然后转换为所需的数据类型的方法,但是这种额外的转换似乎有些笨拙- 是否有更好的方法来做到这一点? 问题答案:

  • 问题内容: 我想将数字转换为(整数类型)。我的实现方式是简单地将with 与转换为。 但是,当我运行该代码时,我得到的不是。因为Go自动将as 存储在变量中。在Golang上执行此类操作的正确方法是什么? 问题答案: 转到规格:转化: 数字类型之间的转换 将浮点数转换为整数时,将舍弃小数(截断为零)。 因此,基本上,当您将浮点数转换为整数时,仅保留整数部分。 如果您只是想避免因用有限位表示而引起的

  • 问题内容: 我正在尝试将字节切片转换为GoLang中的。我找不到在线解决此问题的方法。我见过先转换为字符串然后转换为a的建议,但这似乎不起作用,它失去了它的值,最后以零结束。 例: 而且它不起作用… 问题答案: 例如, 输出:

  • 问题内容: 我试图将列从数据类型转换为使用: 但出现错误: NameError:未定义名称“ int64” 专栏有人数,但其格式为:我知道如何将其更改为? 问题答案: 大熊猫 0.24+的 解决方案,用于转换缺少值的数字: ValueError:无法将非限定值(NA或inf)转换为整数 我认为您需要转换为: 样品: 如果某些S IN列需要他们取代一些(例如)通过,因为的是: 同时检查文档-缺少数据

  • 问题内容: 将数组元素复制到其中的最佳方法是什么? 我需要快速执行此操作,所以最快的方法是什么? 问题答案: 利用创建 “(通过写‘到数组中。更改到返回的列表)’由指定数组支持的固定大小的列表。” 或者,解耦两个数据结构: 或更简洁:

  • 问题内容: 我正在尝试从JSON获取值并将其强制转换为int,但它不起作用,而且我不知道如何正确执行。 这是错误消息: 和代码: 问题答案: 代替 你想要一个类型断言: 您不能转换接口类型值的原因是参考的规范部分中的以下规则: 转换是形式的表达式,其中是类型,并且是可以转换为类型T的表达式。 … 在以下任何一种情况下,可以将非恒定值x转换为类型T: x可分配给T。 x的类型和T具有相同的基础类型。