PHP:使用浮点值计数时的限制

时间:2015-12-29 21:26:03

标签: php floating-point precision

我需要计算数字,但必须使用浮动数据类型(不要为什么 - 它是一种嵌入式系统)。

简单的计数器就像:

$num=1.0;
do {
    $num = $num + 1;
    // do some stuff
    // ...
} while (...);

问题1:使用32位和64位PHP系统可以正确计算的最大数量是多少?

问题2:当在循环开始时使用标准FLOAT类型(未指定精度)从MySQL数据库中读取$num并在循环结束时存储回来时,是问题1的答案还有效吗?

1 个答案:

答案 0 :(得分:1)

PHP使用双精度浮点,它有一个52位的尾数。这意味着使用浮点数表示的整数在达到2 53 时开始失去精度(精度的额外位是因为标准化尾数的前导位始终为1,所以这不需要明确地包括在表示中)。以下示例演示了这一点:

echo number_format(pow(2.0, 53)-1) . "<br>" . 
     number_format(pow(2.0, 53)) . "<br>" .  
     number_format(pow(2.0, 53)+1);

输出:

9,007,199,254,740,991
9,007,199,254,740,992
9,007,199,254,740,992 

要在MySQL中获得等效的浮点精度,您应该使用DOUBLE数据类型,即64位浮点数。如果您只使用FLOAT,您将获得32位单精度,其中只有23位尾数,并且在16,777,216时失去整数精度。

有关MySQL如何在内部存储浮点数的更多详细信息,请参阅FLOAT and DOUBLE Data Type Representation