【发布时间】:2013-09-28 17:20:47
【问题描述】:
考虑下面的 PHP 代码
$a = 8425996523 * 121212713;
$b = sprintf('%.2f', $a);
$mul = gmp_mul("8425996523", "121212713");
输出是
1.0213378982814E+18
1021337898281396864.00
1021337898281396899
实际答案是 1021337898281396899。 因此,很明显我们需要使用任何库,如 gmp_mul 来进行大数运算。
我的问题是,如何识别此类错误? 即,当 PHP 进行类似
的计算时8425996523 * 121212713
,如何识别结果不正确?
我看到的一种方法是检查 E 并假设每当我们强制转换这些数字时,错误就会退出。
【问题讨论】:
-
E是表示,而不是存储数字....数字存储为浮点数...但是如果您需要精度保证,请从一开始就使用 gmp,不要进行整数数学,然后测试结果是否为浮点数并使用 gmp 重做,因为您只是在增加开销 -
另外,有人能说出为什么会出现这种精度错误吗?
-
发生这种情况是因为计算机以二进制形式和有限大小(32 位或 64 位)存储数字 - 它不是 PHP 特定的,但适用于几乎所有在计算机上实现的语言 - @ 987654321@