很好奇以下内容为什么会产生两个不同的值。
fmt.Println(51.231576 * math.Pi / 180) // 0.8941596821857065
fmt.Println(float64(51.231576) * math.Pi / 180) //0.8941596821857064
我了解这是微小的差异,但想了解原因。
谢谢
答案 0 :(得分:1)
这与 untyped constants有关。 无类型浮点常量可以保存比有类型 float64
常量高得多的精度值。
因此,在第二行中,在您的 typeed 常量表达式中,乘法运算产生的浮点精度比第一行中 untyped 常量表达式中的乘法精度要小得多。
实施限制:尽管数字常量具有任意性 语言的精确度,编译器可以使用 内部表示,精度有限。也就是说,每个 实施必须:
- 代表至少256位的整数常量。
- 代表浮点常数,包括复数常数的部分,尾数至少为256位,带符号的二进制指数至少为16位。
- 如果无法精确表示整数常量,则给出错误。
- 如果由于溢出而无法表示浮点数或复数常量,则给出错误。 如果由于精度限制而无法表示浮点数或复数常数,则四舍五入到最接近的可表示常数。