使用php在简单算术中获得的结果不正确

时间:2014-06-12 14:56:19

标签: php add addition subtraction

这是一个简单的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,这是正确的。为什么会这样?

2 个答案:

答案 0 :(得分:3)

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

在浮点(单精度)中,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

默认情况下,舍入到2个小数位以打印浮点值。

浮点数是一个很大的权衡。它是一种数字表示系统,以精确度为代价提供更高的分辨率和范围。为了准确,但是分辨率和范围有限,通常使用定点算法。例如,如果您存储的电压值介于0V和5V之间,并且您希望在1μV分辨率(即0.000001V分度)下进行精确测量,则可以选择以微伏而非伏特表示电压,因此值100000实际上为0.1 V和3827498的电压为3.827498伏特。按照规定的分辨率的数学变得精确,但是你没有能力表示287x10 36 V而没有大量变量来存储数值。

答案 1 :(得分:1)

尝试使用 number_format ,如下所示:

  $a = 100;

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

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

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

  echo $d;