运行此代码以查看我的意思: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)
SmallestNonzeroFloat64在math/const.go中定义,我假设它可以用float64变量表示.
但是当它被解析成一个带有strconv.ParseFloat()和打印的float64时,strconv.FormatFloat()结果是四舍五入的.
而不是4.940656458412465441765687928682213723651e-324我得到5e-324(或它的非指数等价,你可以在Go Playground结果中看到).结果四舍五入.
有办法回来4.940656458412465441765687928682213723651e-324吗?
或者这是一个错误?
你可以要求Go打印更多数字.
fmt.Printf("SmallestNonzeroFloat64 = %.40g\n", SmallestNonzeroFloat64)
// 4.940656458412465441765687928682213723651e-324
Run Code Online (Sandbox Code Playgroud)
然而,5e-324和4.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.
| 归档时间: |
|
| 查看次数: |
75 次 |
| 最近记录: |