【问题标题】:Precision issue when doing math with BigInts使用 BigInts 进行数学运算时的精度问题
【发布时间】:2020-04-29 03:34:11
【问题描述】:

我遇到了一个奇怪的问题...我使用的 API 需要我做一些数学运算...我需要使用以下代码生成一个整数:

import time

id = long((time.time() - 14 * 24 * 60 * 60) * 1000.0 - 1420070400000L) << 22
#Output using 1578430631.86 as timestamp: 659137523812925440

问题是示例是在 python 中,而我正在使用 Javascript...我尝试将其转换为 JS,如下所示:

var ts = (new Date()).getTime() / 1000;
var id = (BigInt((ts - 14 * 24 * 60 * 60) * 1000.0 - 1420070400000) << 22).toString();
//Output using 1578430631.86 as timestamp: 659137520205824000

如您所见,输出不同,这是一个大问题。 如果有人能指出我正确的方向,那将非常感激! 提前致谢!

【问题讨论】:

  • 我无法重现此错误。我唯一的意见是我还需要将 22 包装在 BigInt 中。 (BigInt((ts - 14 * 24 * 60 * 60) * 1000.0 - 1420070400000) &lt;&lt; BigInt(22)).toString()

标签: javascript math bigint


【解决方案1】:

问题是您已经将数字转换为 BigInt 而它已经失去了精度。

所以在进行数学运算之前将所有内容都转换为 BigInts:

var ts = BigInt((new Date()).getTime()) / 1000n;
var id = ((ts - 14n * 24n * 60n * 60n) * 1000n - 1420070400000n << 22n).toString();
//Output using 1578430631.86 as timestamp: 659137520205824000

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-11-20
    • 1970-01-01
    • 2011-02-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多