考虑以下两种情况:
fmt.Println(912 * 0.01) fmt.Println(float64(912) * 0.01)
(转到Playground链接)
第二个打印9.120000000000001,实际上很好
但是,为什么第一行打印9.12,但末尾没有…01?Go是否会将两个未类型化的常数相乘,并在编译时将它们简单地替换为9.12文字?
根据规格:
常量表达式总是精确地求值;中间值和常量本身可能需要比该语言中任何预声明类型支持的精度大得多的精度。
以来
912 * 0.01
是一个常数表达式,它的值精确计算。因此,写作fmt.Println(912*0.01)与写作具有相同的作用fmt.Println(9.12)。当你脚912到float64,浮点乘法的另一个操作数隐含寄托float64了。因此,表达式的float64(912) * 0.01行为类似于float64(912) * float64(0.01)。0.01在a中不能精确表示float64,因此精度float64(912 * 0.01)会在与fmt.Println()您的第一个示例的参数所产生的表达式不同的地方丢失,该表达式解释了不同的结果。
fmt.Println(912*0.01)
fmt.Println(9.12)
912
float64
float64(912) * 0.01
float64(912) * float64(0.01)
float64(912 * 0.01)
fmt.Println()