JavaScript - 将长数字转换为字符串

3
"" + 237498237498273908472390847239084710298374901823749081237409273492374098273904872398471298374
> '2.3749823749827392e+92'

我以一种美妙而神秘的方式计算ID:
time = new Date().getTime()
pid = process.pid
host = 0; (host +=s.charCodeAt(0) for s in os.hostname())
counter = MIPS.unique_id()

"#{host}#{pid}#{time}#{counter}"

很不幸,在某个地方ID(例如11207648813339434616800)出现了问题。不幸的是,这意味着它们有时会变成1.1207648813339434e+22

更新:

看起来这是redis的“错误/特性”。从未想到过这一点。

# Bug with Big Numbers on zadd
redis = require 'redis'
r = redis.createClient()
r.zadd 'zset', '342490809809999998098', 'key', ->
    r.zscore 'zset', 'key', (_, results) ->
        console.log typeof results # string
        console.log results # 3.4249080981000002e+20

你无法存储这个数字。你必须想办法计算出你的唯一ID,使其精度低于19位(可以使用“%1000000000000000000”进行计算)。 - Blender
你是如何将这个传递给客户端层的? - Abdullah Jibaly
2
如果您要将其写在文档的某个地方,则可以将其包装在 JavaScript 字符串或 JSON 对象中。 - Abdullah Jibaly
@Blender % 1e18 怎么样? - Peter C
2个回答

2

Javascript使用8字节双精度存储大数,即53位精度。在您的情况下,它远远超过了53位,因此您应该使用一个可以精确存储大数的库。尝试使用javascript-bignum


1

在将数字与字符串连接以进行转换之前,您的数字将被转换为2.3749823749827392e+92

唯一的解决方案是使用接受任意数量位数的容器格式,这可为字符串或数组。

您能否提供有关如何获取此数字的更多详细信息吗?


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接