JavaScript VS PHP:相同的计算返回不同的结果


JavaScript VS PHP: The same calculation returns different result

我想做一些简单的数学(?)在JavaScript:

( 1023 * 2 ) + 76561197960265728;

我已经在PHP中做了相同的计算,但结果是不同的:

JavaScript: 76561197960267780

PHP: 76561197960267774(右结果)

然后我尝试了以下操作:http://jsfiddle.net/YxBa4/

是否有一个"限制"在JavaScript的高数字计算?

//编辑:

谢谢你的回答,我现在用大一号。

完整的工作代码:

在JSFiddle

在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_INT_SIZE来确定,最大值可以使用常量PHP_INT_MAX来确定,从PHP 4.4.0和PHP 5.0.5开始。摘自http://php.net/manual/en/language.types.integer.php

根据PHP配置,PHP为整型值提供了更大的容量

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

在您的示例中,您可以通过简单地执行:

alert(76561197960265728);

什么会给你一个错误,即使没有任何计算。(输出:' 76561197960265730 ')

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

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

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

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

bcadd('76561197960267774', '76561197960267774');
// 153122395920535548 
http://jsfiddle.net/zELmm/

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

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

更新:-

BigInt是作为JavaScript的原生特性添加的。

但是仍然有一些精度误差在四舍五入,一个变通比较

在JavaScript中比较BigInt和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(正确的结果)