【问题标题】:JavaScript VS PHP: The same calculation returns different resultJavaScript VS PHP:相同的计算返回不同的结果
【发布时间】:2013-04-17 22:32:21
【问题描述】:

我正在尝试用 JavaScript 做一些简单的数学运算 (?):

( 1023 * 2 ) + 76561197960265728;

我已经在PHP中做过同样的计算,但结果不同:

JavaScript:76561197960267780

PHP:76561197960267774(正确的结果)

然后我尝试了以下方法: http://jsfiddle.net/YxBa4/

在 JavaScript 中是否对计算中的大量数字有“限制”?

//编辑:

感谢您的回答,我现在使用BigNumber 一个。

我现在的完整工作代码:

on JSFiddle

【问题讨论】:

标签: php javascript


【解决方案1】:

在 Javascript 中,数字是 64 位浮点值。最大整数(大小)为 253,或 Math.pow(2,53),或 9007199254740992。取自:http://notepad2.blogspot.ca/2012/04/maximum-integer-in-javascript.html

您超过了 1351079458714420。

整数的大小取决于平台,但通常的最大值约为 20 亿(即 32 位有符号)。 64 位平台的最大值通常约为 9E18。 PHP 不支持无符号整数。自 PHP 4.4.0 和 PHP 5.0.5 起,可以使用常量 PHP_INT_SIZE 确定整数大小,使用常量 PHP_INT_MAX 确定最大值。取自http://php.net/manual/en/language.types.integer.php

所以基本上 PHP 允许您根据 PHP 配置为整数值提供更多容量。

【讨论】:

  • 感谢您提供详细信息!
【解决方案2】:

76561197960265730 id 大于 javascript 中允许的最大数字大小。请注意,Javascript 中没有真正的整数,只有 Number 类型,它始终是 64 位浮点值并且与平台无关。但是最大可能的 integer 值只有 2^53,因为至少为逗号和标志位之后的数字保留了 11 位。

在您的示例中,您只需执行以下操作即可看到这一点:

alert(76561197960265728);

即使没有任何计算,什么也会给您带来错误。 (输出:'76561197960265730')

在 php 中,最大整数值取决于您的系统。如果您在 64 位系统上,则 MAX 整数值为 2^64,大于 (2 * 1023) + 76561197960265728。这就是 PHP 中计算成功的原因 - 在 64 位系统上

在 PHP 中,您可以通过读取常量 PHP_INT_MAX 和 `

来检测系统上的最大整数大小

【讨论】:

  • 我现在使用BigNumber - 工作正常。感谢您的回答!
【解决方案3】:

您可以使用 PHP 的 bcmath 扩展及其 JS 转换来获得跨 2 种语言的一致结果:

bcadd('76561197960267774', '76561197960267774');
// 153122395920535548 

http://jsfiddle.net/zELmm/

http://phpjs.org/functions/bcadd/

http://php.net/manual/en/function.bcadd.php

【讨论】:

    【解决方案4】:

    更新:-

    BigInt 被添加为 JavaScript 的原生功能。

    但是四舍五入还是有一些精度误差,一种变通方法比较

    例如这里 full code 用于比较 BigInt 和 JavaScript 中的 Number

    根据这里的初始问题:-

    PHP:76561197960267774(正确的结果)

    var num = BigInt( 1023 * 2 ) + 76561197960265728n;
    
    console.log(num.toString()); 
    
    /* 
    num.toString() removes n at the end of digit.
    
    Output: 76561197960267774
    */

    其中 bigint,通过将 n 附加到整数文字的末尾或通过调用 BigInt() 构造函数来创建。

    所以在使用 BigInt 之后:-

    JavaScript:76561197960267774(正确的结果)

    【讨论】:

    • 请分享更多细节。这两个链接如何解释或解决最初的问题?
    • @NicoHaase 根据初始问题提供了详细信息。
    猜你喜欢
    • 2019-10-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多