Javascript解析int64

Posted

技术标签:

【中文标题】Javascript解析int64【英文标题】:Javascript parsing int64 【发布时间】:2011-07-18 05:24:47 【问题描述】:

如何在 javascript 中将长整数(作为字符串)转换为数字格式而不用 javascript 四舍五入?

var ThisInt = '9223372036854775808'
alert(ThisInt+'\r' +parseFloat(ThisInt).toString()+'\r' +parseInt(ThisInt).toString());

在将其转换为字符串之前,我需要对其执行加法操作,并且如果可能的话,我宁愿不必将其分成两部分。

【问题讨论】:

Number.MAX_SAFE_INTEGER ... Number.MIN_SAFE_INTEGER 【参考方案1】:

所有 Javascript 中的Numbers 是64 位“双”精度IEE754 浮点数。

因此可以准确表示的最大正整数是 2^53 - 1。其余位为指数保留。

您的数字正好是该数字的 1024 倍,因此会丢失 3 个小数位的精度。它根本无法更准确地表示。

在 ES6 中可以使用Number.isSafeInteger( # ) 来测试一个数字,看看它是否在安全范围内:

var ThisInt = '9223372036854775808'; 
console.log( Number.isSafeInteger( parseInt( ThisInt ) ) );

还有一个可用的 BigInteger 库,它应该能够提供帮助,并且避免你必须自己做所有的字符串和小游戏。

EDIT 2018/12 现在有一个原生的 BigInt 类(和新的文字语法)登陆 Chrome 和 NodeJS。

【讨论】:

谢谢。他有很多有用的功能,我可以看到这些功能将在未来一段时间内对我有所帮助。干杯 不客气! JS 中的所有数字实际上都是双精度数这一事实是该语言的基础,但显然并不为人所知。 @Alnitak 如果最大的正整数是 2^53,那么 parseInt() 怎么能返回比这个大的呢? @Alex 对于更大的数字,您将得到一个近似值,在最不重要的位置缺少位。 在 Firefox Quantum 58.0.2 中,运行 javascript:(alert(Math.pow(2, 53))) 返回 9007199254740992,运行 javascript:(alert(-Math.pow(2, 53))) 返回 -9007199254740992。如果我将最大值加 1 或从最小值减去 1,它会返回相同的数字。【参考方案2】:

在递归的帮助下,您可以直接递增您的十进制字符串,无论是表示 64 位数字还是更多...

/**
 * Increment a decimal by 1
 *
 * @param String n The decimal string
 * @return The incremented value
 */
function increment(n) 
    var lastChar = parseInt(n.charAt(n.length - 1)),
        firstPart = n.substr(0, n.length - 1);

    return lastChar < 9
        ? firstPart + (lastChar + 1)
        : firstPart
            ? increment(firstPart) + "0"
            : "10";

【讨论】:

@x3ro:为什么?这一切都是为了习惯正确的缩进。遵循约定的简洁语法通常比需要很长时间才能在精神上解析的冗长代码更好。我认为您在不考虑用法的情况下盲目地应用传统智慧(“简洁不好”)...... @Ates Goral:不,不是真的(对于应用传统智慧)。我明白为什么要这样做,但是我认为它会显着降低代码的可读性,这就是我不喜欢它的原因。但也许我也有点受损,因为我不得不使用大约 10 个嵌套的三元运算符来调试代码,而且没有那么有趣。 @Ates Goral:是的,没错。但是,假设您需要对这样一段代码进行快速更改。可能您宁愿添加另一个三元组而不是重写它,不是吗? :) +1 用于功能建议。一般来说,我不喜欢不必要的复杂性,这可以被认为是那样,但这并不意味着它是一个糟糕的解决方案。这只是意味着如果我不想允许它,我会在我们的编码标准中这么说。毕竟,这就是它们的用途。【参考方案3】:

你不能用标准的 Javascript 做到这一点。但一如既往,有一个漂亮的小库可以帮助我们,在本例中为 BigInt.js,它可以让您使用任意精度的整数。

【讨论】:

【参考方案4】:

您是否尝试过使用 Number 类?var num = new Number(parseFloat(ThisInt))

【讨论】:

【参考方案5】:

只需使用 Number(ThisInt) 代替 Int 或 float

【讨论】:

-1 在 Chrome 中不起作用:number("9223372036854775808")NUMBER("9223372036854775808") 都失败了。 @x3ro - 查看这篇文章,它说 Chrome 也受支持 - w3schools.com/jsref/jsref_Number.asp @Sachin Shanbhag:是的,但是您回答的方式会怀疑 Number 是一个函数,而不是您需要使用 new 创建实例的对象 @x3ro - 嘿,不,我并不是要创建对象实例。查看文章,Number() 函数可以直接使用,无需创建实例。这确实是一个全局函数。 @Sachin Shanbhag:好吧,我的错。无论如何,new Number()Number() 似乎是相同的。

以上是关于Javascript解析int64的主要内容,如果未能解决你的问题,请参考以下文章

jQuery实例分析解析

在 Javascript 中解析 int 的最佳方法

定义8:jquery.cookie用法详细解析

JavaScript解析url

Gmail API - 使用 Javascript 解析邮件内容(Base64 解码?)

FFmpeg视频编解码库,无法解析的外部信号