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