gpt4 book ai didi

go - 如何以正确的方式将 float64 数字更改为 uint64?

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

package main

func main() {
var n float64 = 6161047830682206209
println(uint64(n))
}

输出将是:

6161047830682206208

看起来当 float64 更改为 uint64 时,小数部分被丢弃。

最佳答案

这里的问题是常量和 float 的表示。

常量以任意精度表示。 float 使用 IEEE 754 表示标准。

Spec: Constants:

Numeric constants represent values of arbitrary precision and do not overflow.

Spec: Numeric types:

float64     the set of all IEEE-754 64-bit floating-point numbers

在 IEEE 754 中,使用 64 位的 double (Go 中的 float64)53 位 用于存储数字。这意味着可以表示的最大位数(max number)是2<<52的位数这是(1 位用于符号):

2<<52        : 9007199254740992
Your constant: 6161047830682206209

精确到 15.95 位(16 位,但不是所有可以用 16 位描述的值,最多只能到 9007199254740992)。

您尝试将整数常量放入 float64 类型的变量中只是 不适合 52 位,所以它必须四舍五入并且数字(或位)将被截断(丢失)。

您可以通过打印原始 n float64 来验证这一点编号:

var n float64 = 6161047830682206209
fmt.Printf("%f\n", n)
fmt.Printf("%d\n", uint64(n))

输出:

6161047830682206208.000000
6161047830682206208

问题不在于转换,问题在于 float64您尝试转换的值已经不等于您尝试分配给它的常量。

只是出于好奇:

尝试使用更大的数字:与第一个 const 相比 +500:

n = 6161047830682206709 // +500 compared to first!
fmt.Printf("%f\n", n2)
fmt.Printf("%d\n", uint64(n2))

输出仍然相同(最后的数字/位被截断,包括+500!):

6161047830682206208.000000
6161047830682206208

尝试使用 52 位(少于 ~16 位)精确表示数字的较小数字:

n = 7830682206209
fmt.Printf("%f\n", n)
fmt.Printf("%d\n", uint64(n))

输出:

7830682206209.000000
7830682206209

Go Playground 上试试.

关于go - 如何以正确的方式将 float64 数字更改为 uint64?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30897208/

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