gpt4 book ai didi

go - 如何在不溢出的情况下将大的 float64 存储在字符串中?

转载 作者:IT王子 更新时间:2023-10-29 02:31:02 44 4
gpt4 key购买 nike

func main() {
target := 20190201518310870.0
fmt.Println(int64(target))
z3 := big.NewInt(int64(target))
fmt.Println(z3)
}

结果是20190201518310872

如何转换而不溢出?

最佳答案

问题是即使您输入的 target 数字也不等于您分配给它的常量。

float64 类型使用 double-precision floating-point format (IEEE 754) 来存储数字,它有有限的位可供使用(总共 64 位,但只有 53 位用于存储有效数字)。这意味着它可以粗略地存储 ~16 位数字,但您输入的数字有 17 位,因此它将四舍五入到最接近的可表示 float64

如果您打印 target,您将看到“传输”到 big.Int 的确切数字:

target := 20190201518310870.0
fmt.Printf("%f\n", target)

输出(在 Go Playground 上尝试):

20190201518310872.000000

请注意,如果输入常量“适合”float64,它会起作用:

target := 20190201518310.0
fmt.Printf("%f\n", target)
fmt.Println(int64(target))
z3 := big.NewInt(int64(target))
fmt.Println(z3)

输出(在 Go Playground 上尝试):

20190201518310.000000
20190201518310
20190201518310

如果您需要处理大数字,例如 20190201518310870.0,您必须首先使用另一种类型来存储它,例如stringbig.Intbig.Float,但不是 float64

例如:

target := "20190201518310870"
fmt.Println(target)
z3, ok := big.NewInt(0).SetString(target, 10)
fmt.Println(z3, ok)

输出(在 Go Playground 上尝试):

20190201518310870
20190201518310870 true

关于go - 如何在不溢出的情况下将大的 float64 存储在字符串中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54477761/

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