gpt4 book ai didi

go - 这是预期的 strconv.ParseFloat() 行为还是错误?我怎样才能绕过它?

转载 作者:IT王子 更新时间:2023-10-29 01:50:08 27 4
gpt4 key购买 nike

运行这段代码看看我的意思:Go Playground demo of issue

package main

import (
"fmt"
"strconv"
)

func main() {
// From https://golang.org/src/math/const.go
var SmallestNonzeroFloat64AsString string = "4.940656458412465441765687928682213723651e-324"
var SmallestNonzeroFloat64 float64
var err error
SmallestNonzeroFloat64, err = strconv.ParseFloat(SmallestNonzeroFloat64AsString, 64)
if err != nil {
panic(err)
}
fmt.Printf("SmallestNonzeroFloat64 = %g\n", SmallestNonzeroFloat64)
fmt.Printf("SmallestNonzeroFloat64 = %s\n", strconv.FormatFloat(SmallestNonzeroFloat64, 'f', -1, 64))
}

SmallestNonzeroFloat64math/const.go 中定义我假设它可以用 float64 变量表示。

但是当使用 strconv.ParseFloat() 将其解析为 float64 并使用 strconv.FormatFloat() 打印时,结果会四舍五入。

而不是 4.940656458412465441765687928682213723651e-324 我得到 5e-324 (或其非指数等效项,您可以在 Go Playground 结果中看到)。结果四舍五入。

有没有办法取回 4.940656458412465441765687928682213723651e-324

还是bug?

最佳答案

这不是错误。

您可以要求 Go 打印更多数字。

fmt.Printf("SmallestNonzeroFloat64 = %.40g\n", SmallestNonzeroFloat64)
// 4.940656458412465441765687928682213723651e-324

然而,5e-3244.94…e-324 实际上是相同的值,所以 Go 打印 5e-324 并没有错>。此值 (2-1074) 是 Fl​​oat64(在其他语言中也称为 double)可表示的最小正数。更大的数字都是这个的倍数,例如下一个最小的数字是 2 × 2-1074 = 1e-323,下一个是 3 × 10-1074 = 1.5e-323

换句话说,所有比 5e-324 更精确的数字都不能用 Float64 表示。所以在“5”之后打印更多数字是没有意义的。而且 5e-324 肯定比 4.94…e-324 更具可读性。

关于go - 这是预期的 strconv.ParseFloat() 行为还是错误?我怎样才能绕过它?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42826814/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com