我有一个表,显示来自数据库的值的算术运算。 在数据库中,所有值都是FLOAT类型。 我的算术运算是:
$difference = $row['variable1']+$row['variable2']-$row['variable3']-$row['variable4'];
<td><?php echo (round($difference, 2)) ?></td>
&#13;
因此。我的问题是我插入的一些值的计算。 例如:
variable1=10
variable2=10.08
variable3=10
variable4=10.08
正常它必须给出差异= 0;但它显示差异= -0; 在每种情况下,如果我使用xx.07,xx.08,xx.09的值,它给我一个结果= -0;它不会发生高达xx.07的值。
示例:
variable1=10; variable2=10.06; variable3=10;variable4=10.06; The result = 0;
如果我没有绕过差异,它会得到如下结果:-5.68434188608E-14;
我尝试在计算之前对变量进行舍入,我尝试在计算中使用"()"
,我试图在操作中直接对变量进行舍入,因为我认为它在<
之后需要超过2个值,{ {1}}(FLOAT类型)。
我在插入数据库时尝试对值进行舍入,但是它为输入字段插入了错误,因为它有4个以上的变量(在差异操作中没有使用)。
请帮助我解决这个问题,我真的不明白为什么会这样。
答案 0 :(得分:1)
这是“正常”行为。您可以阅读有关已签名的零here。 现在关于你的问题:添加0应该有所帮助。
<td><?php echo ((round($difference, 2))+0) ?></td>
答案 1 :(得分:0)
在对其进行计算之前,您需要对每个值进行舍入。这是因为PHP在内部存储这些数字的方式。
答案 2 :(得分:0)
答案 3 :(得分:0)
试试这个
$difference = ($row['variable1']+$row['variable2'])-($row['variable3']+$row['variable4']);
答案 4 :(得分:0)
问题是浮点数作为二进制表示存储在数据库中,因此有时与十进制不完全相同。
您可以通过考虑如何存储小数部分来开始理解这一点:
{{1}}
然而,要制作0.08,你必须找到代表这个的1 / 2,1 / 4,1 / 8,1 / 16等的组合。不幸的是,这不能完全用二进制表示,所以它接近但不准确。
使用这些计算时,由于它们不准确,因此可能会存在非常小的差异。你看到的结果是“-0”(负零)代表一个非常小的负数,正如@DannyPhantom所提到的那样。
如果您最多只能使用2位小数,则可以(取决于您的数据库)使用专为此设计的“十进制”类型。
这个在线计算器可以帮助您看到: http://www.binaryconvert.com/result_float.html?decimal=049048046048056
有关更多信息,请参阅此SO问题: How to convert float number to Binary?