繁体   English   中英

如何在字符串中存储一个大的float64而不会溢出?

[英]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 ,则必须使用另一种类型将其存储在第一位,例如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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM