为什么浮点乘法与文字与Go中的变量之间存在差异?

Eri*_*wan 3 floating-point go

为什么Go中的以下不平等?这是一个错误,还是设计?如果是设计,为什么会发生这种情况,这种行为是否记录在任何地方?

https://play.golang.org/p/itEV9zwV2a

package main

import (
    "fmt"
)

func main() {
    x := 10.1

    fmt.Println("x == 10.1:        ", x == 10.1)
    fmt.Println("x*3.0 == 10.1*3.0:", x*3.0 == 10.1*3.0)
    fmt.Println("x*3.0:            ", x*3.0)
    fmt.Println("10.1*3.0:         ", 10.1*3.0)
}
Run Code Online (Sandbox Code Playgroud)

生产:

x == 10.1:         true
x*3.0 == 10.1*3.0: false
x*3.0:             30.299999999999997
10.1*3.0:          30.3
Run Code Online (Sandbox Code Playgroud)

请注意,正在使用不同的语法执行相同的浮点数学运算.那么为什么结果会有所不同呢?我希望在例子中10.1*3.0等于.30.29999...x*3.0

Ray*_*ear 5

Go中的常量和数字文字是无类型的,具有无限的精度.必须将其存储为特定类型的时刻,该类型的边界适用.因此,当您声明时x := 10.1,该文字将转换为a float并失去一些精度.但是当你专门做10.1*3.0这些时,他们有完全的精确度.

请参阅本文中的"Floats"标题.https://blog.golang.org/constants

数字常量存在于任意精度的数值空间中; 他们只是普通的数字.但是当它们被分配给变量时,该值必须能够适合目标.我们可以声明一个具有非常大值的常量:

const Huge = 1e1000 
Run Code Online (Sandbox Code Playgroud)

毕竟这只是一个数字 - 但我们不能分配它甚至打印它.这句话甚至不会编译:

fmt.Println(Huge)
Run Code Online (Sandbox Code Playgroud)

错误是"常量1.00000e + 1000溢出float64",这是真的.但是Huge可能很有用:我们可以在带有其他常量的表达式中使用它,如果结果可以在float64的范围内表示,则使用这些表达式的值.

它是如何实际做到的,特别是在给定的Huge情况下,我不知道.