在 golang 中复制 javascript 个不安全的数字
replicate javascript unsafe numbers in golang
所以在 go 中,我做了一个计算,给出了“5726718050568503296”
在 JS 中它给出“5726718050568503000”
我想在 go 中复制这个行为
似乎没有简单的解决方法。
JS 有其表示 Number 类型的方式,您提供的整数基本上溢出了它的容量。
请参考: 了解更多关于 JS 如何处理这个问题以及为什么会发生这种奇怪行为的信息。
在 go 中复制它会非常棘手,因为您需要查看此 int 的字节表示并尝试假设 JS 将如何处理它。
我会(如上面 link 所建议的那样)将其用作字符串。
正如其他人在 的评论中所讨论的那样,这是由 toString()
在 JavaScript 中实现的方式引起的,它似乎使用了最小有效数字位数return 相同的表示数字,而不是 return 数学上最接近的数字。但是,您可以通过使用 strconv.FormatFloat
:
的特殊 -1
精度在 Go 中复制此行为
package main
import (
"fmt"
"strconv"
)
func main() {
n, _ := strconv.ParseInt(strconv.FormatFloat(5726718050568503296.0, 'f', -1, 64), 10, 64)
fmt.Println(n)
}
所以在 go 中,我做了一个计算,给出了“5726718050568503296” 在 JS 中它给出“5726718050568503000”
我想在 go 中复制这个行为
似乎没有简单的解决方法。 JS 有其表示 Number 类型的方式,您提供的整数基本上溢出了它的容量。 请参考: 了解更多关于 JS 如何处理这个问题以及为什么会发生这种奇怪行为的信息。
在 go 中复制它会非常棘手,因为您需要查看此 int 的字节表示并尝试假设 JS 将如何处理它。
我会(如上面 link 所建议的那样)将其用作字符串。
正如其他人在 toString()
在 JavaScript 中实现的方式引起的,它似乎使用了最小有效数字位数return 相同的表示数字,而不是 return 数学上最接近的数字。但是,您可以通过使用 strconv.FormatFloat
:
-1
精度在 Go 中复制此行为
package main
import (
"fmt"
"strconv"
)
func main() {
n, _ := strconv.ParseInt(strconv.FormatFloat(5726718050568503296.0, 'f', -1, 64), 10, 64)
fmt.Println(n)
}