Модераторы: skyboy, MoLeX, Aliance, ksnk
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> PDO округляет float значения, где выставить точность? 
:(
    Опции темы
solenko
Дата 29.1.2009, 07:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1473
Регистрация: 15.1.2006
Где: Украина

Репутация: 7
Всего: 67



Здравствуйте.
Простейший код для воспроизведения бага (или может это фича?)

Код

CREATE TABLE test(
 f1 float
);

Код

$pdo = new PDO($dns, $username, $password);
$sql = 'INSERT INTO test VALUES (?)';
$stmt = $pdo->prepare($sql);
$params = array('1.1111111111111111111');
$stmt->execute($patams);

Код

SELECT * FROM test;

В результате получаем в базе число, округденног до шестого знака после запятой. 

Вопрос -- как можно обойти это опругление или, по крайней мере, задать его точность?

Добавлено через 1 минуту и 20 секунд
Кстати, такое впечатление, что для бинда параметров внутри PDO используется все та же sprintf:
Код

echo sprintf('%f', 1.1111111111111111111);



--------------------
Ла-ла-ла-ла
Заметьте, нет официального подтверждения, что это не просто четыре слога.
PM MAIL WWW ICQ Skype   Вверх
krundetz
Дата 29.1.2009, 08:48 (ссылка)    | (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Вечный странник
***


Профиль
Группа: Завсегдатай
Сообщений: 1400
Регистрация: 14.6.2007
Где: НН(Сормово)

Репутация: 1
Всего: 69



solenko, у FLOAT есть аргумен размера определяющий максимальную точность, видимо по умолчанию это FLOAT(6), попробуй указать большую точность. Возможно стоит посмотреть в сторону типа данных REAL


--------------------
!цензоры - Хранитель стратегической жидкости
Группа ТГВ
Группа Нижний Новгород
user posted image
PM MAIL   Вверх
solenko
Дата 29.1.2009, 08:51 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1473
Регистрация: 15.1.2006
Где: Украина

Репутация: 7
Всего: 67



Цитата(krundetz @  29.1.2009,  07:48 Найти цитируемый пост)
у FLOAT есть аргумен размера определяющий максимальную точность, видимо по умолчанию это FLOAT(6)

такого нет. Если у вас при создании таблицы определилась точность -- ругайте свой mysql клиент.

Еще раз повторяю, проблемма именно в PDO. Это прекрастно видно в снифере/логе запросов



--------------------
Ла-ла-ла-ла
Заметьте, нет официального подтверждения, что это не просто четыре слога.
PM MAIL WWW ICQ Skype   Вверх
bars80080
Дата 29.1.2009, 10:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


прапор творюет
****
Награды: 1



Профиль
Группа: Завсегдатай
Сообщений: 12022
Регистрация: 5.12.2007
Где: Königsberg

Репутация: 9
Всего: 315



Цитата(solenko @  29.1.2009,  07:51 Найти цитируемый пост)
такого нет

в смысле нет? я всегда создаю поле для цен в формате float(12, 2) , где 2 - количество знаков после запятой
PM MAIL WWW   Вверх
krundetz
Дата 29.1.2009, 12:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Вечный странник
***


Профиль
Группа: Завсегдатай
Сообщений: 1400
Регистрация: 14.6.2007
Где: НН(Сормово)

Репутация: 1
Всего: 69



Цитата(solenko @  29.1.2009,  08:51 Найти цитируемый пост)
такого нет.

кури мануалы, все там есть
Цитата(solenko @  29.1.2009,  08:51 Найти цитируемый пост)
Еще раз повторяю, проблемма именно в PDO. Это прекрастно видно в снифере/логе запросов

так у тебя PDO выполняет роль клиента? Тогда вот тебе ответ:
Цитата(solenko @  29.1.2009,  08:51 Найти цитируемый пост)
Если у вас при создании таблицы определилась точность -- ругайте свой mysql клиент.

Ты хоть попробовал указать явно точность?



--------------------
!цензоры - Хранитель стратегической жидкости
Группа ТГВ
Группа Нижний Новгород
user posted image
PM MAIL   Вверх
solenko
Дата 29.1.2009, 17:22 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1473
Регистрация: 15.1.2006
Где: Украина

Репутация: 7
Всего: 67



bars80080, 
Цитата

видимо по умолчанию это FLOAT(6),

Цитата

 я всегда создаю поле для цен в формате float(12, 2)

Нет никаких умолчаний, если не указана точность.

Цитата

так у тебя PDO выполняет роль клиента?

При вставке -- да. При создании таблиц -- нет.

Цитата

Ты хоть попробовал указать явно точность?

А ты хоть пробовал прикинуть как это работает? PDO НЕ выполняет describe перед каждым запросом, PDO НЕ знает ничего о структуре таблиц, вставка вручную с консоли проходит с необходимой точностью.

Предложения по теме будут?


--------------------
Ла-ла-ла-ла
Заметьте, нет официального подтверждения, что это не просто четыре слога.
PM MAIL WWW ICQ Skype   Вверх
skyboy
Дата 29.1.2009, 18:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


неОпытный
****


Профиль
Группа: Модератор
Сообщений: 9820
Регистрация: 18.5.2006
Где: Днепропетровск

Репутация: 14
Всего: 260



Цитата(solenko @  29.1.2009,  07:51 Найти цитируемый пост)
Это прекрастно видно в снифере/логе запросов

можно привести пример?
PM MAIL   Вверх
solenko
Дата 29.1.2009, 19:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1473
Регистрация: 15.1.2006
Где: Украина

Репутация: 7
Всего: 67



skyboy, пример вы получите если выполните код. Кусок из "боевого лога" выглядит:
Код

INSERT INTO `side` (`poly_id`, `a`, `b`, `c`) VALUES ('429', '0.000858', '0.000099', '-0.018798')

При этом в execute передаются (var_dump($params))
Код

array(4) {
  [0]=>
  int(429)
  [1]=>
  float(0.0008576239377)
  [2]=>
  float(9.91682471E-5)
  [3]=>
  float(-0.0187978100315)
}

Полноценный пример на локальной машине вы сможете получить выполнив код из первого сообщения


--------------------
Ла-ла-ла-ла
Заметьте, нет официального подтверждения, что это не просто четыре слога.
PM MAIL WWW ICQ Skype   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | PHP: Базы Данных | Следующая тема »


 




[ Время генерации скрипта: 0.0707 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.