在GO中,将float32数字转换为float64时,精度会丢失.例如,将359.9转换为Float64将生成359.8999938964844.如果float32可以精确地存储,为什么float64会失go 精度呢?

示例代码:

package main

import (
    "fmt"
)

func main() {
    var a float32 = 359.9
    fmt.Println(a)
    fmt.Println(float64(a))
}

Playground上试用

推荐答案

float(即,浮动32)转换为double(即,浮动64)时,never会失go 精度.前者must是后者的子集.

这更多地与输出格式化程序的默认精度有关.

最近的IEEE754 float到359.9是

359.899993896484375

最近的IEEE754 double到359.9是

359.8999999999999772626324556767940521240234375

最近的IEEE754double到359.899993896484375是

359.899993896484375

(也就是说,是相同的;因为我已经提到了分组规则).

所以你可以看到,float64(a)等于float64(359.899993896484375),float64(359.899993896484375)359.899993896484375.这解释了该输出,尽管您的格式化程序对最后2位进行了四舍五入.

Go相关问答推荐

如何在go中传递C函数指针

Kafka消费者在需要时不会暂停

在Go中根据命名空间/字符串生成UUID

GORM Find方法中缺少字段

切换选项卡时,Goland IDE中的光标自动转移

Golang文本/模板序列范围

创建使用逗号而不是加号分隔OU的CSR

go mod tidy会自动升级go.mod中的go版本吗?

调用库和直接操作效率有区别吗?

在 Cloud Run 中找不到默认凭据

MQTT 客户端没有收到另一个客户端发送的消息

如何使用泛型将接口转换为指定类型

当图像是对象数组的元素时,如何显示存储为页面资源的图像?

Go:从 ssl 证书中获取 'subject/unstructeredName' 的值

具有未导出字段的 struct 类型之间的转换

github.com/rs/zerolog 字段的延迟判断

如何从字符串中删除多个换行符`\n`但只保留一个?

使用不安全的指针从 [] 字符串中获取值

如何在 Gorm 中获得特定日期的最大值?

gopls 为 github.com/Shopify/sarama 返回错误gopls: no packages returned: packages.Load error