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
Форумы портала PHP.SU :: Версия для печати :: При арифметической операции пропадает дробная часть числа
Форумы портала PHP.SU » » Хранение данных, их вывод и обработка » При арифметической операции пропадает дробная часть числа

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

1. evgenydz - 13 Мая, 2011 - 08:45:15 - перейти к сообщению
Работаю над интернет-магазином. (Программированием занимаюсь где-то полгода, ранее занимался только дизайном и версткой) Все ровненько, складненько, только вот незадача: при подсчете суммы в корзине куда-то пропадает дробная часть. Бьюсь уже довольно давно не могу понять в чем причина((((

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

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 руб. Т.е. дробная часть просто откидывается. Буду признателен, если подскажите почему и как это вылечить?... Заранее спасибо!
2. Zuldek - 13 Мая, 2011 - 09:07:24 - перейти к сообщению
CODE (htmlphp):
скопировать код в буфер обмена
  1. <?PHP
  2. $a = "12,25";
  3. $b = 1;
  4. $c = $a * $b;
  5. echo $c;
  6. // 12
  7. ?>

Учите операции с типами данных и преобразование типов данных.
3. EuGen - 13 Мая, 2011 - 09:12:54 - перейти к сообщению
Здесь не столько операции с типами, сколько некорректно записанное вещественное число.
В PHP разделителем целой и дробной частей является точка (то есть".")
Что-то вроде этого Вам будет еще нужно:
$summ[$i] = (double)$row["price"] *(double) $row["amount"]
(не забывайте, что $row['price'] должно содержать не "12,25" а 12.25) - тип поля в БД поставьте как DOUBLE
4. Zuldek - 13 Мая, 2011 - 09:21:00 - перейти к сообщению
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? Однако
5. EuGen - 13 Мая, 2011 - 09:24:07 - перейти к сообщению
1. Какими бы приведениями типов Вы не пользовались, "12,25" не превратится в 12.25 Приведение типов лишь поможет понять, почему оно превращается в 12
2. Если в БД тип данных поля - строка, но лежит там "12.25" (именно как строка), а не 12.25 то явное приведение к double указывает на то, что трактовать в PHP скрипте эти данные нужно было бы как число, ограничивая, например, допустимый набор операций для него (скажем, конкатенация уже будет некорректна). Здесь double скорее для указания того, что мы понимаем, что делаем, это не несет строгих ограничений.

 

Powered by ExBB FM 1.0 RC1