一尘不染

为什么这两个float64具有不同的值?

go

考虑以下两种情况:

fmt.Println(912 * 0.01)
fmt.Println(float64(912) * 0.01)

转到Playground链接

第二个打印9.120000000000001,实际上很好

但是,为什么第一行打印9.12,但末尾没有…01?Go是否会将两个未类型化的常数相乘,并在编译时将它们简单地替换为9.12文字?


阅读 214

收藏
2020-07-02

共1个答案

一尘不染

根据规格

常量表达式总是精确地求值;中间值和常量本身可能需要比该语言中任何预声明类型支持的精度大得多的精度。

以来

912 * 0.01

是一个常数表达式,它的值精确计算。因此,写作fmt.Println(912*0.01)与写作具有相同的作用fmt.Println(9.12)。当你脚912float64,浮点乘法的另一个操作数隐含寄托float64了。因此,表达式的float64(912) * 0.01行为类似于float64(912) * float64(0.01)。0.01在a中不能精确表示float64,因此精度float64(912 * 0.01)会在与fmt.Println()您的第一个示例的参数所产生的表达式不同的地方丢失,该表达式解释了不同的结果。

2020-07-02