PHP 浮点数未正确添加 - 缺少十进制值


PHP float numbers not adding correctly - decimal value missing

我正在尝试获取包含数字的变量总数,有些可能是小数。 我需要它到小数点后两位,并且正在使用 number_format() 函数。

$total =  $order->order->net+$order->order->deductions+$order->order->vat+$order->order->postage+$order->order->postage_tax; 
            echo number_format((float)$total, 2, '.', '');?>

我注意到以下值加起来不正确,似乎忽略了小数。总数应该是 118.50,但我得到 118.00。

100+0+17.5+1+0

我已经对此进行了研究,并发现了以下内容

http://floating-point-gui.de/basic/

我对此有点

困惑。 谁能解释我需要做什么?

*编辑下面是 $order 变量的转储,显示了我试图加起来的数字。 你可以看到 17.5 是 17.5 而不是 17。 是因为它们被指定为字符串吗?

object(SimpleXMLElement)#12 (21) { ["id"]=> string(6) "922704" ["shopkeeper_orderno"]=> string(4) "1001" ["customer"]=> string(6) "797893" ["creationdate"]=> string(16) "29-05-2012 11:55" ["net"]=> string(3) "100" ["vat"]=> string(4) "17.5" ["status"]=> string(1) "1" ["isnew"]=> string(1) "0" ["deductions"]=> string(1) "0" ["postage"]=> string(1) "1" ["paymentmethod"]=> string(20) "PayPal " ["instructions"]=> object(SimpleXMLElement)#17 (0) { } [2]=> object(SimpleXMLElement)#22 (1) { ["items"]=> object(SimpleXMLElement)#30 (9) { ["id"]=> string(7) "1384486" ["headerID"]=> string(6) "922704" ["productID"]=> string(7) "4959678" ["description"]=> string(13) "Wedding dress" ["net"]=> string(3) "100" ["vat"]=> string(4) "17.5" ["qty"]=> string(1) "1" ["formID"]=> string(2) "-1" ["options"]=> object(SimpleXMLElement)#31 (1) { ["options"]=> array(2) { [0]=> object(SimpleXMLElement)#32 (6) { ["id"]=> string(6) "519981" ["orderDetailsID"]=> string(7) "1384486" ["optionid"]=> string(6) "646934" ["optionCost"]=> string(1) "0" ["optionVAT"]=> string(1) "0" ["customText"]=> string(9) "size : 12" } [1]=> object(SimpleXMLElement)#33 (6) { ["id"]=> string(6) "519982" ["orderDetailsID"]=> string(7) "1384486" ["optionid"]=> string(6) "647285" ["optionCost"]=> string(1) "0" ["optionVAT"]=> string(1) "0" ["customText"]=> string(14) "Colour : Ivory" } } } } } } ["postage_tax"]=> string(1) "0" ["dispatched"]=> string(1) "0" ["paybyotherid"]=> string(2) "-1" ["wheredidyouhearid"]=> string(2) "-1" }

您可以使用四舍五入然后数字格式:

  $total = 100+0+17.5+1+0.2;
//echo number_format((float)$total);  //119
  echo number_format(round((float)$total,2),2);  //118.50

你确定你所有的变量都是 int 或浮型吗?将类型检查为

var_dump($order->order->net, $order->order->deductions, $order->order->vat,$order->order->postage, $order->order->postage_tax);

如果您对这些变量使用了number_format,它们可能是字符串,请使用 floatval()。

检查示例,

$a = 100+0+"17,5"+1+0;
    var_dump($a);

结果 : int(118)

$b = 100+0+17.5+1+0;
    var_dump($b);

结果 : 浮点数(118.5)

请检查可变$order->order->vat的值。我认为这不是 17.5,因为如果我们为您分配的值分配给可变值并添加它们,它会显示正确的答案。

$a = 100;
$b = 0;
$c = 17.5;
$d = 1;
$e = 0;

$total = $a + $b + $c + $d + $e; 回显number_format(浮点)$total, 2, '.', '');118.50(答案)

或使用floatval($var)获取变量的浮点值。

$total =  $order->order->net+$order->order->deductions+floatval($order->order->vat)+$order->order->postage+$order->order->postage_tax; 
 echo number_format((float)$total, 2, '.', '');?>

我希望这将是工作。

谢谢

如果您正在寻找没有任何更正或舍入的精确值,则应使用 bcadd 以下函数来获取实际的两个小数点

$total =  $order->order->net+$order->order->deductions+$order->order->vat+$order->order->postage+$order->order->postage_tax; 
$total=bcadd(0,$total,2);
echo $total;

通常,您希望舍入到 2dp 的函数是"圆形"而不是"number_format"。

显然,在你的回声中,他们都会做同样的事情。如果您想将来使用它进行处理,Round 将永久调整数字。

话虽如此,我看不到您的代码中的任何错误,或者应该删除 0.5 的任何原因。我建议您检查$order->订单->增值税实际上是 17.5 而不是 17。如果它是 17,则向后追逐它以找到您对其进行整数化的位置(例如,在数据库或输入验证函数中)