【问题标题】:Incorrect results obtained in simple arithmetic using php使用 php 在简单算术中获得不正确的结果
【发布时间】:2014-06-12 14:56:19
【问题描述】:

这是一个简单的 PHP 脚本:

<?php
  $a = 100;
  $b = 91.51;
  $c = 8.49;

  $d = $a - $b - $c;
  echo $d;
?>

它输出 -5.3290705182008E-15 这很难看 稍作改动如下:

  $d = $a - ($b + $c);
  echo $d;
?>

输出为 0,这是正确的。为什么会这样?

【问题讨论】:

标签: php add addition subtraction


【解决方案1】:

浮点数学实际上非常不准确。这是一个“最佳猜测”值;)

浮点数(单精度)100 - 91.51 不是您期望的 8.49,而是 8.4899978638,因为值 8.49 不能精确地以浮点数表示。使用双精度它会变得更好,因为它相当于 8.48999999999999488409 更接近一点。不过仍然不准确。

以下面的代码为例:

echo (100 - 91.51) . "\n";
echo number_format(100 - 91.51, 20) . "\n";

你期望的输出

8.49
8.49000000000000000000

但实际上是这样的:

8.49
8.48999999999999488409

打印浮点值时默认舍入到小数点后两位。

浮点数在很大程度上是一种权衡。它是一种数字表示系统,以准确性为代价提供更高的分辨率和范围。为了准确,但分辨率和范围有限,通常使用定点算法。例如,如果您要存储 0V 和 5V 之间的电压值,并且想要以 1µV 分辨率进行精确测量(即 0.000001V 分度),您可以选择以微伏而不是伏特来表示电压,因此 100000 的值实际上是 0.1 V 和 3827498 将是 3.827498 伏。您指定分辨率下的数学运算变得精确,但是您无法在没有大量变量来存储值的情况下表示 287x1036V。

【讨论】:

  • 那为什么echo 100 - 91.51 显示8.49?在页面上输出之前是否四舍五入?
  • 是的。尝试在其上使用number_format() 以获得更多小数位。
  • @Styphon - 精确到您的 php.ini 文件中定义的精度级别
  • 这取决于你以前的工作是什么。你是 NASA 多年前错过火星的原因吗?
  • 可能是真的。使用我为他们编写的软件,他们可能计算出错误的光分钟数。
【解决方案2】:

尝试像这样使用 number_format

  $a = 100;

  $b = number_format(91.51, 0, ".", "." );

  $c = number_format(8.49, 0, ".", "." );

  $d = $a - $b - $c;

  echo $d;

【讨论】:

    猜你喜欢
    • 2015-02-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多