Php 数值意外向下舍入

Php 数值意外向下舍入,php,math,rounding,addition,subtraction,Php,Math,Rounding,Addition,Subtraction,我有一个循环,它计算两个收入值,然后将它们相加,如下所示: $SalesGrowth = $C2012Sales+$C2011Sales; 在某些情况下,这是可行的,我得到了预期的结果,例如:761.9+759.0=1520.9 在其他情况下,PHP似乎随机决定不正确地取整(?)并更改单位(?),我得到: 8788.0+8794.3=16 这是怎么回事?我甚至尝试过用空格分隔单独的销售值,它们显示正确,因此基本数字没有错误。被解释为一个数字,8788.0只是8,解析在逗号处停止 如果您想允许像

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

$SalesGrowth = $C2012Sales+$C2011Sales;
在某些情况下,这是可行的,我得到了预期的结果,例如:761.9+759.0=1520.9

在其他情况下,PHP似乎随机决定不正确地取整(?)并更改单位(?),我得到:

8788.0+8794.3=16


这是怎么回事?我甚至尝试过用空格分隔单独的销售值,它们显示正确,因此基本数字没有错误。

被解释为一个数字,
8788.0
只是
8
,解析在逗号处停止

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


更新:如果您有,您可以执行以下操作:

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"

您可以尝试从环境中获取语言环境,而不是硬编码语言环境:
newZend_语言环境(setlocale(LC_ALL,”)
解释为数字,
8788.0
只是
8
,解析在逗号处停止

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


更新:如果您有,您可以执行以下操作:

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"

您可以尝试从环境中获取语言环境,而不是硬编码语言环境:
newZend_语言环境(setlocale(LC_ALL,”)
这非常简单。。。当您要求PHP使用
+
运算符时,它将隐式地将这些字符串(如
“8788.0”
转换为数值。因为您有一个
字符,它终止了数字的用途,并导致它被解释为
8
。等等


去掉非
[0-9.]
字符,它会工作得更好。

这很简单。。。当您要求PHP使用
+
运算符时,它将隐式地将这些字符串(如
“8788.0”
转换为数值。因为您有一个
字符,它终止了数字的用途,并导致它被解释为
8
。等等


去掉非
[0-9.]
字符,它会工作得更好。

解决逗号问题

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

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

哥们,逗号问题

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

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

请注意,761.9是一个有效数字,而8788.0不是(从PHP的角度来看)

因此,数字上下文中的
8788.0
将计算为8,就像
8794.3
一样。8+8=16


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

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

因此,数字上下文中的
8788.0
将计算为8,就像
8794.3
一样。8+8=16


要解决这个问题,请处理数据,使数字格式正确。

看起来它不喜欢逗号,不是吗?@fge:不确定你是否有幽默感,但那条评论让我发笑:)有趣的是,在php.net上查看money\u format,而
number\u format
将数字转换为本地化字符串,似乎没有一个反向,即一个区域设置感知的字符串解析器。这是关于这个问题的。可能会有帮助。只是看起来它不喜欢逗号,不是吗?@fge:不确定你是否有幽默感,但那句话让我笑了:)看看php上的money\u格式。有趣的是,
number\u格式
将数字转换为本地化字符串,但似乎没有相反的结果,即,区域设置感知字符串解析器。这是关于这个问题的。可能会有帮助。谢谢——问题是,逗号是由DataTable.js(用于显示排序表等的javascript库)打印的,所以我就是这样将它们粘贴到这里的——实际的销售数字只是从MySQL数据库中提取出来并预先计算出来的……Ohhhhh——number_format()是否插入了逗号?我想这就是发生的事情…@BenWilson:如果可以,请使用数据库中的实际数字,而不是一些格式化的字符串表示形式。@BenWilson:在某些情况下确实如此,但我认为您必须显式请求数千个分隔符。但是,如果已经有实际的数字数据,就不要使用格式化字符串!谢谢--问题是,逗号是由DataTable.js(一个用于显示排序表等的javascript库)打印出来的,所以我就是这样将它们粘贴到这里的--实际的销售数字只是从MySQL数据库中提取出来并预先计算出来的…Ohhhhh--number_format()是否插入了逗号?我想这就是发生的事情…@BenWilson:如果可以,请使用数据库中的实际数字,而不是一些格式化的字符串表示形式。@BenWilson:在某些情况下确实如此,但我认为您必须显式请求数千个分隔符。但是,如果已经有实际的数字数据,就不要使用格式化字符串!