数值意外地向下舍入

时间:2012-01-04 18:54:54

标签: php math rounding addition subtraction

我有一个循环计算几个收入值,然后将它们加在一起,如下所示:

$SalesGrowth = $C2012Sales+$C2011Sales;

在某些情况下,这是有效的,我得到预期的,例如:761.9 + 759.0 = 1520.9

在其他情况下,看起来PHP随机决定不正确地圆(??)并更改单位(??)并得到:

8,788.0 + 8,794.3 = 16

这里发生了什么?我甚至尝试回显用空格分隔的单独销售价值,并且它们正确显示,因此基本数字没有错。

4 个答案:

答案 0 :(得分:9)

解释为数字,8,788.0只是8,解析停在逗号处。

如果你想允许像千位分隔符这样的噱头,你需要一些区域设置感知的数字解析。


更新:如果您拥有Zend Framework,则可以执行以下操作:

require_once('Zend/Locale/Format.php');

$locale = new Zend_Locale('en_GB'); // #1

$v = "8,410.5";
$n = Zend_Locale_Format::getNumber($v, array('locale' => $locale,'precision' => 3));

echo 2 * $number;   // prints "16821"

您可以尝试从环境中对其进行硬编码:new Zend_Locale(setlocale(LC_ALL, ""))

答案 1 :(得分:3)

打扰逗号问题......

在添加数字之前删除数字中的所有逗号......

str_replace(",","",$no1);

答案 2 :(得分:2)

这很简单......当你要求PHP使用+运算符时,它会隐式地将这些字符串(如"8,788.0")转换为数值。由于您有一个,字符,它会终止该数字的有用性,并导致它被解释为8。等等...

删除非[0-9.]个字符,它会更好用。

答案 3 :(得分:2)

请注意,761.9是有效数字,而8,788.0不是(从PHP的角度来看)。

因此,数字上下文中的8,788.0将评估为8,就像8,794.3一样。 8 + 8 = 16。

要解决此问题,请处理您的数据以正确格式化数字。