PHP中数值计算转整数后出现负数且结果错误的原因探究
问题原因分析
先看你的代码和输出:
<?php $result =((7.4331585723947)**24); echo (int)(3*$result); ?>
输出:
-6779465221961940992
出现负数且结果错误,核心原因有两个:
浮点数精度限制
7.4331585723947的24次方是个极大的数,远超PHP默认双精度浮点数的精确存储范围。双精度浮点数只能精确表示2^53以内的整数,超过这个范围的数值会被近似存储,导致$result本身就不是精确的数学计算结果,后续乘以3后的数值自然也不准确。有符号整数溢出回绕
就算浮点数计算完全精确,3*$result的结果也远远超过了64位有符号整数的最大值(约9.2×10^18)。PHP里强制把超大数值转成int时,会触发有符号整数的溢出回绕——超过最大值的数会按照补码规则循环到负数区间,最终输出错误的负数。
如果要得到精确结果,可以用PHP的BCMath高精度扩展来计算,示例代码:
<?php bcscale(20); // 设置足够的小数位数保证精度 $result = bcpow('7.4331585723947', '24'); $total = bcmul($result, '3'); echo $total; ?>
内容的提问来源于stack exchange,提问作者Asif Iqbal
相关产品推荐
相关产品推荐

