PHP - суммирование массива десятичных значений

Я пытаюсь вычислить сумму массива десятичных значений в PHP, но по какой-то причине он продолжает округляться до целых чисел.

Например:

$oldArray = array(0.00,1000.11,988.92,978.22,964.01,953.07,948.82,917.26,902.56,913.21,904.08,898.86,892.79);
$myVar = 0.0;
for($k=1;$k<10;$k++)
{
$myVar += $oldArray[$k];
}
print_r($myVar);

$oldArray на самом деле заполняется десятичными значениями из SQL-запроса (длина $oldarray составляет около нескольких сотен, но мне нужны первые 10. В приведенном выше примере я ожидаю, что $myVar будет десятичным, но оказывается чтобы быть просто целым числом Я попытался установить $myVar = 0,0000 перед циклом for, я попробовал $myVar += $oldArray[$k] + 0,0000 и т. д., но ничего не работает.

Что я делаю не так? Как явно указать $myVar как десятичное число?


person Community    schedule 22.06.2009    source источник
comment
Вы устанавливаете точность своих переменных где-то, что может повлиять на это?   -  person AlbertoPL    schedule 22.06.2009
comment
Массивы PHP основаны на 0. для($k=0...). Кроме того, вы должны инициализировать $myVar на 0,00 выше цикла for.   -  person gahooa    schedule 22.06.2009
comment
Мне не нужен нулевой член. Я инициализировал его от 0,0 до 0,0000. И я не знаю, есть ли место для установки точности переменных.   -  person    schedule 22.06.2009


Ответы (4)


Учитывая, что это кажется невозможным воспроизвести, для меня это звучит как проблема с самой вашей средой PHP.

Проверьте в php.ini параметр под названием «точность» и убедитесь, что для него установлено значение по умолчанию, равное 14 значащим цифрам. Я не могу представить, почему это будет изменено, но это определенно окажет влияние.

person Matchu    schedule 22.06.2009
comment
да, я пробовал ini_set(precision, 14); и теперь он отлично работает. Благодарность! - person ; 22.06.2009
comment
Круто :) Вы определенно захотите выяснить корень этой проблемы, чтобы вам больше не пришлось с ней работать ›_‹ - person Matchu; 23.06.2009

Вместо этого вы можете попробовать использовать array_sum() и использовать (float ), чтобы привести значения. Кроме того, я бы убедился, что значения в массиве имеют правильный формат (1,45, а не 1,45). ХТН.

Обновить

Кстати. вы можете использовать "is_float()" для проверки каждого параметра в массиве.

person merkuro    schedule 22.06.2009
comment
Я не могу использовать array_sum(), потому что мне нужна сумма только для части массива. И я все равно попробовал, и он все равно выдал целое число. - person ; 22.06.2009
comment
вы можете использовать arry_sum(array_slice($oldArray,1,10)) чтобы получить сумму первых 10 элементов oldArray (исключая 0-й элемент) - person Eineki; 22.06.2009

Не могу воспроизвести это.

php > $oldArray = array(0, .1, .2, .3, .4, .5, .6, .7, .8, .9);                                                    
php > $myVar = 0.0;
php > for($k=0;$k < count($oldArray);$k++)
php > {
php { $myVar += $oldArray[$k];
php { }
php > print_r($myVar);
4.5

РЕДАКТИРОВАТЬ: я попробовал код в вашем комментарии, и все в порядке. Как и AlbertoPL, я подозреваю, что проблема в другом.

php > $oldArray = array(0.01,1000.11,988.92,978.22,964.01,953.07,948.82,917.26,902.56,913.21,904.08,898.86,892.79);
php > $myVar = 0.0000;
php > for($k=1;$k<10;$k++)
php >   $myVar += $oldArray[$k];
php > print_r($myVar);
8566.18
person Matthew Flaschen    schedule 22.06.2009
comment
$oldArray = массив (0,01 1000,11 988,92 978,22 964,01 953,07 948,82 917,26 902,56 913,21 904,08 898,86 892,79); $myVar = 0,0000; for($k=1;$k‹10;$k++) $myVar += $oldArray[$k]; print_r ($ моя переменная); я получаю целое число -.- - person ; 22.06.2009
comment
Также запускал в консоли PHP, получил 8566.18 =/ - person Matchu; 22.06.2009

Сделайте свою собственную реализацию:

function sum_array($arr){
 $count = 0;
  foreach ($arr as $val){
    if (!is_numeric($val) // neglect any non numeric values
      {
        $error = true;
        continue;
      }
      else{
        $count = $count + ($val*1); //casting to numeric if the value supplied as string
      }
  }
  return $count
}

echo sum_array($myArray);
person SaidbakR    schedule 20.04.2016