我需要计算数字,但必须使用浮动数据类型(不要为什么 - 它是一种嵌入式系统)。
简单的计数器就像:
$num=1.0;
do {
$num = $num + 1;
// do some stuff
// ...
} while (...);
问题1:使用32位和64位PHP系统可以正确计算的最大数量是多少?
问题2:当在循环开始时使用标准FLOAT类型(未指定精度)从MySQL数据库中读取$num
并在循环结束时存储回来时,是问题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。