【问题标题】:Basic Multiplication with PHPPHP的基本乘法
【发布时间】: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@

标签: php numbers


【解决方案1】:

使用

$b = sprintf('%.2d', $a);

代替

$b = sprintf('%.2f', $a);

这里是源代码的截图来显示差异:


【讨论】:

  • 这无济于事。这也将给出答案 1021337898281396864.00 ,其中实际答案是 1021337898281396899
  • 帮帮我...查看最新版本的屏幕截图。
  • 我的 php 没有给我这个结果。可能是在 64 位而不是 32 位下工作
  • 请提供您正在使用的php版本和操作系统(32位或64位)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-04-26
  • 1970-01-01
  • 2012-04-27
  • 1970-01-01
  • 2017-11-06
相关资源
最近更新 更多