这是strconv.ParseFloat()预期的行为还是一个错误?我怎么能绕过它呢?

Koa*_*la3 1 go

运行此代码以查看我的意思:Go Playground演示问题

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))
}
Run Code Online (Sandbox Code Playgroud)

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

但是当它被解析成一个带有strconv.ParseFloat()和打印的float64时,strconv.FormatFloat()结果是四舍五入的.

而不是4.940656458412465441765687928682213723651e-324我得到5e-324(或它的非指数等价,你可以在Go Playground结果中看到).结果四舍五入.

有办法回来4.940656458412465441765687928682213723651e-324吗?

或者这是一个错误?

ken*_*ytm 7

这不是一个错误.

你可以要求Go打印更多数字.

fmt.Printf("SmallestNonzeroFloat64 = %.40g\n", SmallestNonzeroFloat64)
// 4.940656458412465441765687928682213723651e-324
Run Code Online (Sandbox Code Playgroud)

然而,5e-3244.94…e-324实际上相同的值,这样下去是没有错的印刷5e-324.该值(2 -1074)是Float64(也称为double其他语言)可表示的最小正数.较大的数字都是这个的倍数,例如,下一个最小的数字将是2×2 -1074 = 1e-323,下一个将是3×10 -1074 = 1.5e-323,等等.

换句话说,所有数字都比5e-324Float64中无法表示的更精确.因此,在"5"之后打印更多数字是没有意义的.并且5e-324肯定比可读性更强4.94…e-324.