Go:为什么从float64转换为float32并返回会导致值发生更改?
有没有一种方法可以在不改变数据的情况下处理此强制转换 f:=64-3942.2 fmt.Printlnfloat64float32f/=-3942.199951171875 返回-3942.2的唯一方法是将其重新设置为float32: fmt.Printlnfloat32float64float32f/=-3942.2 编辑: 这不是格式问题: f:=64-3942.2 fmt.Printlnf==float64float32f//false 编辑2: fmt.Printlnf/-3942.2 fmt.Printlnfloat32f==float32float64float32f//trueGo:为什么从float64转换为float32并返回会导致值发生更改?,go,Go,有没有一种方法可以在不改变数据的情况下处理此强制转换 f:=64-3942.2 fmt.Printlnfloat64float32f/=-3942.199951171875 返回-3942.2的唯一方法是将其重新设置为float32: fmt.Printlnfloat32float64float32f/=-3942.2 编辑: 这不是格式问题: f:=64-3942.2 fmt.Printlnf==float64float32f//false 编辑2: fmt.Printlnf/-3942.2
它们是相同的值,只是fmt的默认格式。Println显示一个较低的有效数字,但不显示另一个 比照 float32的精度低于float64。这两种类型都不能精确表示实数-3942.2,但float64更接近实数 转换为float32时,该值必须四舍五入到最接近的float32值。丢失的信息无法恢复;回溯到float64将不会复制原始值 对float32的第三次强制转换(如在float32float64float32f中)不会恢复原始值。因为fmt.Println的默认舍入行为,所以看起来像是这样。默认情况下,fmt.Println将打印具有足够数字的浮点值,以便将它们与相同类型的其他值区分开来
因为float64精度更高,区分float64float32f与其他float64值所需的小数位数大于区分float32f或float32float64float32f与其他float32值所需的小数位数。它们不是相同的值fmt.Printlnfloat64float32f==f//false@Chance在你的原创文章中,你从不打印价值如果不将f直接转换为float32,则-3942.2不能准确地存储在float32中,也不能存储在float64中,但在float64中,您将有更多的数字,因此这就是它们不相等的原因。@mgagnon fmt.Printlnf/-3942.2 fmt.Printlnfloat32f==float32float64float32f//true@Chance这就是我所期望的。一旦转换成float32,它就无法恢复失去的精度。@我的答案解释了原始问题输出的差异。不,比较float64float32f==f是没有意义的,因为会失去精度。但是在你像问题的v1一样失去它之后——它们是相同的值。根据原始问题:fmt.Printlnfloat32f==float32float64float32f//true,如预期
package main
import (
"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