【问题标题】:Large numbers in PHP are not what they seem to bePHP 中的大量数字并不是它们看起来的那样
【发布时间】:2018-04-25 14:08:47
【问题描述】:

我同意这个

php > var_dump(number_format(10000000000000000000000)); // 10^22
php shell code:1:
string(30) "10,000,000,000,000,000,000,000"

这里发生了什么?

php > var_dump(number_format(100000000000000000000000)); // 10^23
php shell code:1:
string(30) "99,999,999,999,999,991,611,392"

谁能给我解释一下这里到底发生了什么?

【问题讨论】:

标签: php


【解决方案1】:

这在the documentation中有很好的描述:

整数溢出

如果 PHP 遇到超出 integer 类型范围的数字,它将被解释为 float。此外,导致数字超出 integer 类型范围的操作将改为返回 float。

示例 #3 64 位系统上的整数溢出

<?php
$large_number = 9223372036854775807;
var_dump($large_number);                     // int(9223372036854775807)

$large_number = 9223372036854775808;
var_dump($large_number);                     // float(9.2233720368548E+18)

$million = 1000000;
$large_number =  50000000000000 * $million;
var_dump($large_number);                     // float(5.0E+19)
?>

浮点数无法准确表示许多值。详情请见Is floating point math broken?。

PHP_INT_MAX constant 显示您的 PHP 版本支持的最大整数。

【讨论】:

    【解决方案2】:

    Floating point numbers.

    计算机内存有限,因此不可能存储无限精确的整数值。您的系统基本上没有足够的空间进行精确的整数估值。

    This answer 在谈论如何让整数出现在你想要的数字上做得很好。

    【讨论】:

      【解决方案3】:

      更改 php.ini 中的精度或使用 ini_set 并在您的 var 中应用强制转换

      ini_set('precision', 2048);
      $number1 = (float) "0.00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001";
      $number3 = (float) "0.000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001";
      
      $test1 = (0 == $number1);
      $test2 = (0 == $number3);
      

      【讨论】:

      • 这如何回答这个问题?
      猜你喜欢
      • 1970-01-01
      • 2020-08-22
      • 1970-01-01
      • 2016-08-24
      • 1970-01-01
      • 1970-01-01
      • 2015-11-05
      • 1970-01-01
      相关资源
      最近更新 更多