如何以正确的方式将float64数字更改为uint64?
package mainfunc 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 : 9007199254740992Your constant: 6161047830682206209
精确到15.95位数字(16位数字,但不是您可以用16位数字描述的所有值,最多不超过9007199254740992
)。
您尝试放入类型变量的整数常量float64
根本 52位,因此必须四舍五入,并且数字(或位)将被截断(丢失)。
您可以通过打印原始n float64
号码来进行验证:
var n float64 = 6161047830682206209fmt.Printf("%f\n", n)
fmt.Printf("%d\n", uint64(n))
输出:
6161047830682206208.0000006161047830682206208
问题不在于转换,问题在于float64
您尝试转换的值已经不等于您尝试为其分配的常数。
使用更大的数字尝试相同的操作:与第一个const相比,+ 500:
n = 6161047830682206709 // +500 compared to first!fmt.Printf("%f\n", n2)
fmt.Printf("%d\n", uint64(n2))
输出 相同(最后一位/位被截断,包括+500!):
6161047830682206208.0000006161047830682206208
尝试使用一个较小的数字,该数字可以使用52位(小于16位数字)精确表示:
n = 7830682206209fmt.Printf("%f\n", n)
fmt.Printf("%d\n", uint64(n))
输出:
7830682206209.0000007830682206209
在Go Playground上尝试一下。
以上是 如何以正确的方式将float64数字更改为uint64? 的全部内容, 来源链接: utcz.com/qa/415715.html