浮点精度golang

时间:2019-10-15 21:43:05

标签: go

很好奇以下内容为什么会产生两个不同的值。

    fmt.Println(51.231576 * math.Pi / 180) // 0.8941596821857065
    fmt.Println(float64(51.231576) * math.Pi / 180) //0.8941596821857064

我了解这是微小的差异,但想了解原因。

谢谢

1 个答案:

答案 0 :(得分:1)

这与 untyped constants有关。 无类型浮点常量可以保存比有类型 float64常量高得多的精度值。

因此,在第二行中,在您的 typeed 常量表达式中,乘法运算产生的浮点精度比第一行中 untyped 常量表达式中的乘法精度要小得多。

  

实施限制:尽管数字常量具有任意性   语言的精确度,编译器可以使用   内部表示,精度有限。也就是说,每个   实施必须:

     
      
  • 代表至少256位的整数常量。
  •   
  • 代表浮点常数,包括复数常数的部分,尾数至少为256位,带符号的二进制指数至少为16位。
  •   
  • 如果无法精确表示整数常量,则给出错误。
  •   
  • 如果由于溢出而无法表示浮点数或复数常量,则给出错误。   如果由于精度限制而无法表示浮点数或复数常数,则四舍五入到最接近的可表示常数。
  •   

查看相关内容:https://stackoverflow.com/a/57512022/965900