Числовые значения неожиданно округляются - PullRequest
1 голос
/ 04 января 2012

У меня есть цикл, который вычисляет пару значений дохода, а затем складывает их вместе, например:

$SalesGrowth = $C2012Sales+$C2011Sales;

В некоторых случаях это работает, и я получаю ожидаемое, например: 761,9 + 759,0 = 1520,9

В других, похоже, что PHP случайно решает неправильно округлить (??) И изменить единицы измерения (??), и я получаю:

8 788,0 + 8 794,3 = 16

Что здесь происходит? Я даже пытался отобразить отдельные значения продаж, разделенные пробелом, и они отображаются правильно, поэтому основные цифры не ошибаются.

Ответы [ 4 ]

9 голосов
/ 04 января 2012

Интерпретируется как число, 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, ""))

3 голосов
/ 04 января 2012

Чувак запятая ....

удалите все запятые из чисел перед добавлением их ...

str_replace(",","",$no1);
2 голосов
/ 04 января 2012

Обратите внимание, что 761.9 является действительным числом, а 8,788.0 - нет (с точки зрения PHP).

Таким образом, 8,788.0 в контексте чисел будет оцениваться как 8, как и 8,794.3.И 8 + 8 = 16.

Чтобы решить эту проблему, обработайте данные, чтобы отформатировать числа правильно.

2 голосов
/ 04 января 2012

Это довольно просто ... Когда вы просите PHP использовать оператор +, он неявно преобразует эти строки, такие как "8,788.0", в числовое значение. Поскольку у вас есть символ ,, он прекращает использование числа и приводит к его интерпретации как 8. И так далее ...

Избавьтесь от не [0-9.] символов, и это будет работать лучше.

...