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

PHP: Limits when Counting with float values

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

简单的计数器是这样的:

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

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

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

PHP 使用双精度浮点数,尾数为 52 位。这意味着使用浮点数表示的整数在达到 253 时开始失去精度(额外的精度是因为规范化尾数的前导位始终为 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