我从前一页传递/携带$ 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);
?>
答案 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
。