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

package main

func main() {

var n float64 = 6161047830682206209

println(uint64(n))

}

输出将是:

6161047830682206208

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

回答:

这里的问题是常量和浮点数的表示形式。

常数以任意精度表示。浮点数使用IEEE

754标准表示。

规格:常数:

数字常数表示任意精度的值,并且不会溢出。

规格:数值类型:

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

在IEEE 754中,使用64位(float64在Go中)的

双精度用于存储数字。这意味着可以表示的最大位数(最大位数)是其中的位数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上尝试一下。

以上是 如何以正确的方式将float64数字更改为uint64? 的全部内容, 来源链接: utcz.com/qa/415715.html

回到顶部