Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/topic.php on line 737
Форумы портала PHP.SU :: При арифметической операции пропадает дробная часть числа

 PHP.SU

Программирование на PHP, MySQL и другие веб-технологии
PHP.SU Портал     На главную страницу форума Главная     Помощь Помощь     Поиск Поиск     Поиск Яндекс Поиск Яндекс     Вакансии  Пользователи Пользователи


 Страниц (1): [1]   

> Без описания
evgenydz
Отправлено: 13 Мая, 2011 - 08:45:15
Post Id


Новичок


Покинул форум
Сообщений всего: 1
Дата рег-ции: Май 2011  


Помог: 0 раз(а)




Работаю над интернет-магазином. (Программированием занимаюсь где-то полгода, ранее занимался только дизайном и версткой) Все ровненько, складненько, только вот незадача: при подсчете суммы в корзине куда-то пропадает дробная часть. Бьюсь уже довольно давно не могу понять в чем причина((((

Вот метод, который собсно достает из базы значения и распихивает по нужным объектам:

PHP:
скопировать код в буфер обмена
  1.  
  2. function lightBasket() {
  3.                 $sql = 'SELECT `price`, `amount` FROM `purchases` WHERE `sess_id`="'.$this->session.'"';
  4.                 $rez=mysql_query($sql);
  5.                 $query_log=mysql_num_rows($rez);
  6.                 if($query_log > 0) {
  7.                         for($i = 0; $i < $query_log; $i++ ) {
  8.                                 $row = mysql_fetch_array($rez, MYSQL_ASSOC);
  9.                                 $summ[$i] = $row["price"] * $row["amount"];
  10.                         }
  11.                         $this->basket_summ = array_sum($summ);
  12.                         $this->basket_amount = $query_log;
  13.                 } else {
  14.                         $this->basket_amount = 0;
  15.                         $this->basket_summ = 0;
  16.                 }
  17.         }
  18.  


Теперь два слова о том, что живет в базе и что получается на выходе.
В данный момент для примера в табличку purchases забит 1 товар в количестве одна шт, ценой 12,25 коп. Вывел эхом $row["price"] полкчил правильное значение - 12,25 коп. А вот после $summ[$i] = $row["price"] * $row["amount"]; сумма становится уже просто 12 руб. Т.е. дробная часть просто откидывается. Буду признателен, если подскажите почему и как это вылечить?... Заранее спасибо!
 
 Top
Zuldek
Отправлено: 13 Мая, 2011 - 09:07:24
Post Id


Постоянный участник


Покинул форум
Сообщений всего: 2122
Дата рег-ции: Июнь 2010  


Помог: 50 раз(а)




CODE (htmlphp):
скопировать код в буфер обмена
  1. <?PHP
  2. $a = "12,25";
  3. $b = 1;
  4. $c = $a * $b;
  5. echo $c;
  6. // 12
  7. ?>

Учите операции с типами данных и преобразование типов данных.

(Отредактировано автором: 13 Мая, 2011 - 09:09:43)

 
 Top
EuGen Администратор
Отправлено: 13 Мая, 2011 - 09:12:54
Post Id


Профессионал


Покинул форум
Сообщений всего: 9095
Дата рег-ции: Июнь 2007  
Откуда: Berlin


Помог: 707 раз(а)




Здесь не столько операции с типами, сколько некорректно записанное вещественное число.
В PHP разделителем целой и дробной частей является точка (то есть".")
Что-то вроде этого Вам будет еще нужно:
$summ[$i] = (double)$row["price"] *(double) $row["amount"]
(не забывайте, что $row['price'] должно содержать не "12,25" а 12.25) - тип поля в БД поставьте как DOUBLE


-----
Есть в мире две бесконечные вещи - это Вселенная и человеческая глупость. Но насчет первой .. я не уверен.
 
 Top
Zuldek
Отправлено: 13 Мая, 2011 - 09:21:00
Post Id


Постоянный участник


Покинул форум
Сообщений всего: 2122
Дата рег-ции: Июнь 2010  


Помог: 50 раз(а)




EuGen пишет:
Здесь не столько операции с типами, сколько некорректно записанное вещественное число.
В PHP разделителем целой и дробной частей является точка (то есть".")
Что-то вроде этого Вам будет еще нужно:
$summ[$i] = (double)$row["price"] *(double) $row["amount"]
тип поля в БД поставьте как DOUBLE


1. Здесь именнно операции с типами данных и неправильная запись значения. в бд 12,25 стоит как строка.
2. Объясните назначение приведения к double в строке $summ[$i] = (double)$row["price"] *(double) $row["amount"], если в бд тип поля double? Однако

(Отредактировано автором: 13 Мая, 2011 - 09:23:04)

 
 Top
EuGen Администратор
Отправлено: 13 Мая, 2011 - 09:24:07
Post Id


Профессионал


Покинул форум
Сообщений всего: 9095
Дата рег-ции: Июнь 2007  
Откуда: Berlin


Помог: 707 раз(а)




1. Какими бы приведениями типов Вы не пользовались, "12,25" не превратится в 12.25 Приведение типов лишь поможет понять, почему оно превращается в 12
2. Если в БД тип данных поля - строка, но лежит там "12.25" (именно как строка), а не 12.25 то явное приведение к double указывает на то, что трактовать в PHP скрипте эти данные нужно было бы как число, ограничивая, например, допустимый набор операций для него (скажем, конкатенация уже будет некорректна). Здесь double скорее для указания того, что мы понимаем, что делаем, это не несет строгих ограничений.


-----
Есть в мире две бесконечные вещи - это Вселенная и человеческая глупость. Но насчет первой .. я не уверен.
 
 Top
Страниц (1): [1]
Сейчас эту тему просматривают: 0 (гостей: 0, зарегистрированных: 0)
« Хранение данных, их вывод и обработка »


Все гости форума могут просматривать этот раздел.
Только зарегистрированные пользователи могут создавать новые темы в этом разделе.
Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.
 



Powered by PHP  Powered By MySQL  Powered by Nginx  Valid CSS  RSS

 
Powered by ExBB FM 1.0 RC1. InvisionExBB