【问题标题】:Arithmetic operations with php variablesphp变量的算术运算
【发布时间】:2015-09-08 07:25:34
【问题描述】:

我有一个表格,它显示了一个算术运算,其中包含来自数据库的值。 在数据库中,所有值都是 FLOAT 类型。 我的算术运算是:

        $difference = $row['variable1']+$row['variable2']-$row['variable3']-$row['variable4'];
<td><?php echo (round($difference, 2)) ?></td>

所以。我的问题是我插入的一些值的计算。 例如:

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;

我尝试在计算之前对变量进行四舍五入,我尝试在计算中使用"()",我尝试在操作中直接对变量进行四舍五入,因为我认为在&lt;之后需要超过2个值,&gt;(FLOAT类型)。

我在插入数据库时​​尝试对值进行四舍五入,但它给我插入输入字段时出错,因为它有超过 4 个变量(未在差异操作中使用)。

感谢帮助我解决这个问题,我真的不明白为什么会这样。

【问题讨论】:

标签: php html mysql


【解决方案1】:

这是“正常”行为。您可以阅读有关有符号零here 的信息。 现在谈谈您的问题:添加 0 应该会有所帮助。

<td><?php echo ((round($difference, 2))+0) ?></td>

【讨论】:

    【解决方案2】:

    在对每个值进行计算之前,您需要对其进行四舍五入。这是因为 PHP 在内部存储这些数字的方式。

    【讨论】:

      【解决方案3】:

      注意: 默认情况下,PHP 不能正确处理像“12,300.2”这样的字符串。见converting from strings

      Read about php round() function

      【讨论】:

        【解决方案4】:

        试试这个

        $difference = ($row['variable1']+$row['variable2'])-($row['variable3']+$row['variable4']);

        【讨论】:

          【解决方案5】:

          问题是浮点数以二进制表示形式存储在数据库中,因此有时与十进制不完全相同。

          您可以通过思考小数部分的存储方式来开始理解这一点:

          0.5 (dec)   is 1/2 which in binary as 0.1 (bin)
          0.25 (dec)  is 1/4 which in binary as 0.01 (bin)
          0.125 (dec) is 1/8 which in binary as 0.001 (bin)
          

          但是,要获得 0.08,您必须找到代表这一点的 1/2、1/4、1/8、1/16 等的组合。不幸的是,这不能用二进制精确表示,所以它很接近,但并不精确。

          使用这些进行计算时,由于它们并不精确,因此可能会存在非常小的差异。正如@DannyPhantom 提到的,您看到的结果“-0”(负零)代表一个非常小的负数。

          如果您只打算使用最多 2 位小数,您可以(取决于您的数据库)使用专为此设计的“小数”类型。

          此在线计算器将帮助您查看: http://www.binaryconvert.com/result_float.html?decimal=049048046048056

          有关更多信息,请参阅此 SO 问题: How to convert float number to Binary?

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2023-03-23
            • 1970-01-01
            • 1970-01-01
            • 2013-02-17
            • 1970-01-01
            相关资源
            最近更新 更多