为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

Go
PIPIONE 2022-08-15 19:42:49
有没有办法在不更改数据的情况下处理这种强制转换?f := float64(-3942.2)fmt.Println(float64(float32(f))) // = -3942.199951171875返回的唯一方法是将其重铸为:-3942.2float32fmt.Println(float32(float64(float32(f)))) // = -3942.2https://play.golang.org/p/ReIefOPEaoz编辑:这不是格式问题:f := float64(-3942.2)fmt.Println(f == float64(float32(f))) // false编辑2:fmt.Println(f) // -3942.2fmt.Println(float32(f) == float32(float64(float32(f)))) // true
查看完整描述

2 回答

?
子衿沉夜

TA贡献1828条经验 获得超3个赞

float32精度低于 。这两种类型都不能完全表示实数 -3942.2,但会越来越近。float64float64

转换为 时,该值必须舍入为可表示为 的最接近的值。丢失的信息无法恢复;转换回将不会重现原始值。float32float32float64

第三个强制转换回 ,如 中所示,不会恢复原始值。它之所以看起来像这样,是因为 的默认舍入行为。默认情况下, 将打印具有足够数字的浮点值,以将其与相同类型的其他值区分开来。float32float32(float64(float32(f)))fmt.Printlnfmt.Println

由于具有更高的精度,因此与其他值区分所需的十进制位数大于区分或与其他值区分开来所需的十进制位数。float64float64(float32(f))float64float32(f)float32(float64(float32(f)))float32


查看完整回答
反对 回复 2022-08-15
?
慕后森

TA贡献1802条经验 获得超5个赞

它们是相同的值,它只是显示一个有效数字较少的默认格式,而不是另一个。fmt.Println



https://play.golang.org/p/hJs-5Oz_YlL


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


查看完整回答
反对 回复 2022-08-15
  • 2 回答
  • 0 关注
  • 719 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信