为什么减去值超过1000的php变量算错误

时间:2018-02-11 17:12:31

标签: php html

我从前一页传递/携带$ total。然后我输入$ amount_tendered,然后将两个变量传递给最终的PHP页面进行处理。只要我将变量值保持在1000以下,所有工作都是完美的。如果超过1000,则两个变量不能正确减去。实际上非常奇怪,当我从$ amount_tendered减去$ total时,它总是等于1.如果我在减法过程之前对变量进行硬编码,它会正确计算。您将在下面的PHP代码中注意到我的两个//项。我知道在页面之间传递变量时我必须做错。像变量类型或东西,但只是不确定。

谢谢

  

HTML

<?php 
$total = isset($_REQUEST['total']) ? $_REQUEST['total'] : "";
?>
<form action="cash_final.php" method="post">
<?php 
  echo '
      <input type="hidden" name="total" value="' . $total . '" /> 
  ';
?>
<div class="main_style" style="">
    <input class="main_input_style" type="text" name="amount_tendered" /> 
</div>
<div class="main_style" style=""> 
    <button  type="submit" >Continue </button> 
</div>
</form>
  

cash_final.php

<?php 
    $total = 0;
    $amount_tendered = 0;
    $total = isset($_REQUEST['total']) ? $_REQUEST['total'] : "";
    $amount_tendered = isset($_REQUEST['amount_tendered']) ? $_REQUEST['amount_tendered'] : "";
    //     $total = "1138.78";
    //     $amount_tendered = "2000.00";
    echo 'total = ' . $total;
    echo '<br>amount_tendered = ' . number_format($amount_tendered,2);
    $c = floatval($amount_tendered) - floatval($total);
    echo '<br>change_due = ' . number_format($c,2);
?>

3 个答案:

答案 0 :(得分:1)

尝试:

floatval($amount_tendered) - floatval($total)

在对它们进行算术运算之前,您需要将数字转换为十进制或整数或数字。 number_format将它们转换为字符串。你不能用字符串算术。

证明:

$ php -a
Interactive shell

php > $total = "1138.78";
php > $amount_tendered = "2000.00";
php > echo floatval($amount_tendered) - floatval($total);
861.22
php > echo number_format($amount_tendered,2) - number_format($total, 2);
1
php >     $c = floatval($amount_tendered) - floatval($total);
php >     echo '<br>change_due = ' . number_format($c,2);
<br>change_due = 861.22
php >     $c = $amount_tendered - $total;
php >     echo '<br>change_due = ' . number_format($c,2);
<br>change_due = 861.22
php

答案 1 :(得分:1)

虽然字符串确实被转换为类型,但格式化的字符串不会被删除,因此它们不会减去。它们必须是未格式化的。

前:

echo "2000.05" - "4000.67";

会给你答案-2000.62

但是,

echo "2,000.05" - "4,000.67";

这不会奏效。会显示一些奇怪的答案。

答案 2 :(得分:0)

为什么它表现得很奇怪(一旦你知道发生了什么,这并不奇怪)。考虑PHP中真正的int或浮点数与碰巧包含看起来像int或浮点数的字符串的值:1.23 vs "1.23"。为了有用(但有时很危险),PHP会将类似浮点的字符串转换为实际的浮点数,以便进行算术运算。

number_format将格式化int / float以供人类查看。 number_format(1.234,2)变为"1.23",仍可用于算术运算。但是,number_format(1234.12,2)之类的任何大于1000的内容都会变为"1,234.12"。字符串中的逗号虽然可以被人理解,但PHP无法理解:PHP会认为"1,234.12""foobar"类似,并且不会将其转换为算术使用。

这解释了原因。现在,为了你应该做的事情:先做你所有的算术,只在你向人类展示结果之前使用number_format