当我减去两个值时,我得到awk结果,错误是我得到指数值2.7755575615629E-17而不是0.我想要申请的任何东西,请建议。这些情况发生在某些情况下,例如0.66,0.67,0.33,
我正在使用的代码的原型如下,
$_SESSION['x'] = 1;
$_SESSION['x'] = $_SESSION['x'] - 0.83;
echo ( $_SESSION['x']- 0.17) ;
echo '<br>';
但在扭转价值时,这一切都很好,0
$_SESSION['x'] = 1;
$_SESSION['x'] = $_SESSION['x'] - 0.17;
echo ( $_SESSION['x']- 0.83) ;
echo '<br>';
答案 0 :(得分:3)
这是因为它的浮点数。并根据手册
“浮点数的大小取决于平台,但最大值为1.8e308,精度约为14位十进制数是一个常见值(64位IEEE格式)。”
http://php.net/manual/en/language.types.float.php
现在有两件事可以通过使用将结果转换为(int)或向上舍入结果来完成。
另一种选择是使用sprintf
这是一个例子
$a = 0.00001234;
echo $a ;
输出将为
1.234E-5
现在,如果我们这样做
echo (int)$a ;
The output is 0
或
echo round($a) ;
output will be 0
最后,如果我们这样做
echo sprintf('%f', $a);
We will get 0.000012
答案 1 :(得分:2)
这是计算机语言中的常见问题 - 浮点值未准确表示。另见http://en.wikipedia.org/wiki/Floating_point#Accuracy_problems。如果您想要精确计算特定数量的小数位,可以使用PHP中的bcmath
函数:
$_SESSION['x'] = 1;
$_SESSION['x'] = bcsub($_SESSION['x'], 0.83, 10);
echo bcsub($_SESSION['x'], 0.17, 10);
echo '<br>';
否则,您只需使用计算并为计算结果添加round($result, $numberOfDecimalPlaces)
。