As per spec:
Constant expressions are always evaluated exactly; intermediate values and the constants themselves may require precision significantly larger than supported by any predeclared type in the language.
Since
912 * 0.01
is a constant expression, it is evaluated exactly. Thus, writing fmt.Println(912 * 0.01)
has the same effect as writing fmt.Println(9.12)
. When you pin 912
to float64
, the other operand of the floating-point multiplication is implicitly pinned to float64
, too. Thus, the expression float64(912) * 0.01
behaves like float64(912) * float64(0.01)
. 0.01 is not exactly representable in a float64
, thus precision is lost in a different place than in the expression float64(912 * 0.01)
which arises in the argument of fmt.Println()
in your first example, explaining the different results.