在golang中复制javascript不安全数字

问题描述

所以在 go 中,我做了一个计算,给出“5726718050568503296” 在 JS 中,它给出“5726718050568503000”

我想在 go 中复制这种行为

解决方法

正如其他人在 Why is 5726718050568503296 truncated in JS 的评论中所讨论的那样,这是由 toString() 在 JavaScript 中实现的方式引起的,它似乎使用最少的有效数字来返回相同的表示数字,而不是返回数学上最接近的数字。但是,您可以通过使用特殊的 -1 精度和 strconv.FormatFloat:

在 Go 中复制此行为
package main

import (
    "fmt"
    "strconv"
)

func main() {
    n,_ := strconv.ParseInt(strconv.FormatFloat(5726718050568503296.0,'f',-1,64),10,64)
    fmt.Println(n)
}

游乐场链接:https://play.golang.org/p/9ZObcB3so4o

,

似乎没有简单的方法可以解决。 JS 有其表示 Number 类型的方式,您提供的整数基本上会溢出它的容量。 请参阅:https://stackoverflow.com/a/1379973/10316247 以了解有关 JS 如何处理此问题以及为什么会发生这种奇怪行为的更多信息。

在 go 中复制它会非常棘手,因为您需要查看这个 int 的字节表示并尝试假设 JS 将如何处理它。

我会(如上面的链接所示)将其用作和字符串。