Go:为什么从 float64 转换为 float32 并返回会导致值发生变化?

有没有办法在不更改数据的情况下处理这种强制转换?


f := float64(-3942.2)

fmt.Println(float64(float32(f))) // = -3942.199951171875

返回的唯一方法是将其重铸为:-3942.2float32


fmt.Println(float32(float64(float32(f)))) // = -3942.2

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


编辑:

这不是格式问题:


f := float64(-3942.2)

fmt.Println(f == float64(float32(f))) // false

编辑2:

fmt.Println(f) // -3942.2

fmt.Println(float32(f) == float32(float64(float32(f)))) // true


PIPIONE
浏览 720回答 2
2回答

子衿沉夜

float32精度低于 。这两种类型都不能完全表示实数 -3942.2,但会越来越近。float64float64转换为 时,该值必须舍入为可表示为 的最接近的值。丢失的信息无法恢复;转换回将不会重现原始值。float32float32float64第三个强制转换回 ,如 中所示,不会恢复原始值。它之所以看起来像这样,是因为 的默认舍入行为。默认情况下, 将打印具有足够数字的浮点值,以将其与相同类型的其他值区分开来。float32float32(float64(float32(f)))fmt.Printlnfmt.Println由于具有更高的精度,因此与其他值区分所需的十进制位数大于区分或与其他值区分开来所需的十进制位数。float64float64(float32(f))float64float32(f)float32(float64(float32(f)))float32

慕后森

它们是相同的值,它只是显示一个有效数字较少的默认格式,而不是另一个。fmt.Println儗https://play.golang.org/p/hJs-5Oz_YlLpackage mainimport (    "fmt")func main() {    f := float64(-3942.2)    fmt.Printf("float64(float32(f)):\t\t%.20f\n", float64(float32(f)))    fmt.Printf("float32(float64(float32(f))):\t%.20f\n", float32(float64(float32(f)))) // = -3942.2}// float64(float32(f)):     -3942.19995117187500000000// float32(float64(float32(f))):    -3942.19995117187500000000
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go