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]   

> Без описания
gheka
Отправлено: 30 Января, 2012 - 01:10:21
Post Id



Частый гость


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


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




C толкнулся с такой проблемой как в писание числовых данных в базу данных.
Есть запрос MYSQL
тип поля "z_money" в базе, FLOAT. z_money = 13.7

CODE (SQL):
скопировать код в буфер обмена
  1.  
  2. $t = "UPDATE `" . DB_PREFIX . "test` SET `z_money`=z_money-%s WHERE `id`='%d'";
  3.  $result = mysql_query (sprintf ($t, mysql_real_escape_string ( '13' ),
  4.                                 mysql_real_escape_string ( $user ['id'] ) ));
  5.  
  6.  

Такой запросы выполняет действия вычитания 13.7 - 13 вроде всё легко но в при этом в базу данных вписывается результат 0.0699997
И такое происходит с числами 0.05 до 0.09 допустим если такой же запрос выполнить с 13.4 - 13 получится 0.04 как и должно быть.
По чему так и как можно решить эту проблему?
Только прошу не писать типа сначала вычесть данные в переменной а потом уже вставить полученное в базу.
Может стоит выбрать другой тип поля не FLOAT а что то другое?
Может кто то подскажет из своих скриптов как сам решает такие вопросы с вычетанием суммы у пользователей?

(Отредактировано автором: 30 Января, 2012 - 01:14:03)

 
 Top
OrmaJever Модератор
Отправлено: 30 Января, 2012 - 01:31:14
Post Id



Активный участник


Покинул форум
Сообщений всего: 7540
Дата рег-ции: Янв. 2010  
Откуда: Чернигов


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




у типа float плохая точность. Такое во многих языках програмирования и идёт гдето из глубины. Тип double должен решить эту проблему


-----
Если вы хотя бы 3-4 раза не решите всё выкинуть и начать заново - вы явно что-то делаете не так.
 
 Top
Мелкий Супермодератор
Отправлено: 30 Января, 2012 - 10:45:21
Post Id



Активный участник


Покинул форум
Сообщений всего: 11926
Дата рег-ции: Июль 2009  
Откуда: Россия, Санкт-Петербург


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




OrmaJever пишет:
Тип double должен решить эту проблему

Те же яйца, но в 2 раза больше.

Используйте тип decimal.
Float есть float, если интересно, почему так работает - читайте про то, как он хранится.


-----
PostgreSQL DBA
 
 Top
illy
Отправлено: 30 Января, 2012 - 11:07:04
Post Id



Участник


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


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




gheka пишет:
13.4 - 13 получится 0.04 как и должно быть.

должно быть 0.4 Хорошо


-----
Всё гениальное - просто
И ещё проще, если ты - индиго
 
 Top
gheka
Отправлено: 30 Января, 2012 - 16:56:12
Post Id



Частый гость


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


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




illy пишет:
gheka пишет:
13.4 - 13 получится 0.04 как и должно быть.

должно быть 0.4 Хорошо


Ну тут просто опечатка 13.04 - 13 = 0.04 Хорошо
Попробую все верянты описные выше буду рад выслушать дополнительные верянты исправления таких ситуации.
 
 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