登录
首页 >  Golang >  Go问答

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

来源:stackoverflow

时间:2024-04-14 10:33:39 216浏览 收藏

在IT行业这个发展更新速度很快的行业,只有不停止的学习,才不会被行业所淘汰。如果你是Golang学习者,那么本文《如何在字符串中存储一个大的float64而不溢出?》就很适合你!本篇内容主要包括##content_title##,希望对大家的知识积累有所帮助,助力实战开发!

问题内容

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

以上就是《如何在字符串中存储一个大的float64而不溢出?》的详细内容,更多关于的资料请关注golang学习网公众号!

声明:本文转载于:stackoverflow 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>