Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/go/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Go:为什么从float64转换为float32并返回会导致值发生更改?_Go - Fatal编程技术网

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

Go:为什么从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

有没有一种方法可以在不改变数据的情况下处理此强制转换

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//true
它们是相同的值,只是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