【问题标题】:replicate javascript unsafe numbers in golang [closed]在golang中复制javascript不安全的数字[关闭]
【发布时间】:2021-07-17 04:35:11
【问题描述】:

所以在进行中,我计算得出“5726718050568503296” 在 JS 中它给出“5726718050568503000”

我想在 go 中复制这种行为

【问题讨论】:

标签: javascript go integer uint


【解决方案1】:

正如其他人在 Why is 5726718050568503296 truncated in JS 的 cmets 中所讨论的那样,这是由 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

【讨论】:

    【解决方案2】:

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

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

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

    【讨论】:

    • 用不同的语言不是问题。它根本没有 JS 特有的东西。
    • 你是对的。刚刚编辑了我的答案
    • "而你提供的整数基本上超出了它的容量。" - - 它不是。请参阅stackoverflow.com/q/67222143/251311 的长时间讨论。这并不简单。 “并尝试假设 JS 将如何处理它。” --- 不需要,有 ES2021 规范。
    猜你喜欢
    • 2013-12-28
    • 2021-02-20
    • 2021-08-28
    • 1970-01-01
    • 2011-06-16
    • 2017-02-23
    • 2018-08-13
    • 2012-10-27
    • 1970-01-01
    相关资源
    最近更新 更多