[英]How to store a big float64 in a string without overflow?
func main() {
target := 20190201518310870.0
fmt.Println(int64(target))
z3 := big.NewInt(int64(target))
fmt.Println(z3)
}
结果是20190201518310872
我该如何转换而不溢出?
问题是,即使您输入的target
编号也不等于您为其分配的常数。
float64
类型使用双精度浮点格式 (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
(例如20190201518310870.0
,则必须使用另一种类型将其存储在第一位,例如string
, big.Int
或big.Float
,而不是float64
。
例如:
target := "20190201518310870"
fmt.Println(target)
z3, ok := big.NewInt(0).SetString(target, 10)
fmt.Println(z3, ok)
输出(在Go Playground上尝试):
20190201518310870
20190201518310870 true
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.