PDA

Просмотр полной версии : [Вопрос] Почему MySQL неправильно показывает число после точки для Float-значений?



Paradox
14.06.2018, 22:51
Доброе время суток, вообще возник вопрос, почему в базу данных записывает float до точки?
Допустим из:


-800.350500


В базе данных будет так:


-800


Запись происходит так:


new str[64], Float: px;
GetPlayerPos(playerid, px, _, _);
format(str, 64, "INSERT INTO `test` (`px`) VALUES ('%f')", px);
mysql_function_query(query, str, false, "", "");

Почему так? и как сделать так что бы записывало полностью, то что после точки тоже..

whale
14.06.2018, 23:46
%0.xf
x - количество знаков, которые будут выведены после запятой.

ziggi
15.06.2018, 00:00
Какой тип у этого поля в таблице?

Paradox
15.06.2018, 00:27
float (lenght 12), если имеет значение то engine InnoDB (format row compact), дело в том что работаю с базами mysql первый раз..

- - - Добавлено - - -

сомневаюсь что оно поможет дело в том что в из GetPlayerPos в переменную записывает корректно, то бишь уже в саму базу запись идет таков.

ziggi
15.06.2018, 10:15
float (lenght 12), если имеет значение то engine InnoDB (format row compact), дело в том что работаю с базами mysql первый раз..

- - - Добавлено - - -

сомневаюсь что оно поможет дело в том что в из GetPlayerPos в переменную записывает корректно, то бишь уже в саму базу запись идет таков.

А запрос на сохранение/добавление как выглядит?

Paradox
15.06.2018, 14:24
Это добавление через cmd:


new str[64], Float: px;
GetPlayerPos(playerid, px, _, _);
format(str, sizeof(str), "INSERT INTO `test` (`ID`, `px`) VALUES ('%d', '%f')", id, px);
mysql_function_query(query, str, false, "", "");


Загрузка:


IDS = cache_get_field_content_int(i, "ID", query);
Pos_X = cache_get_field_content_float(i, "px", query);


Сохранение:


format(str, sizeof(str), "UPDATE `test` SET px = '%f' WHERE `ID` = '%d'", Pos_X, IDS);
mysql_function_query(query, str, false, "", "");


- - - Добавлено - - -

Ах, да не знаю имеет какое-то значение или MySQL R39-6 стоит.

ziggi
15.06.2018, 15:09
Даже не знаю, было подобное, помогло изменение типа на double.

DeimoS
15.06.2018, 16:45
Попробуй вывести так:

SELECT format(/*тут столбец с твоим значением*/, 7) FROM таблица

Если в первом посте ты привёл лишь пример, который сочинил на ходу, а на деле говоришь о том, что в базе значение округляется, то "проблема" заключается в том, что ты не указываешь сколько знаков после точки нужно отображать, а по умолчанию в MySQL выводит, если мне память не изменяет, только два знака после точки. Когда ты делаешь запрос на отображение значения, MySQL не просто отображает число, обрубая все "лишние" значения после точки, а преобразует его в тот вид, который требуется (соответственно, округляя).

А вообще, если нужна точность, то следует использовать тип "Decimal (https://dev.mysql.com/doc/refman/5.5/en/fixed-point-types.html)", ибо в MySQL типы "Float" и "Double" хранят приблизительные значения числа (об этом написано тут (https://dev.mysql.com/doc/refman/5.5/en/floating-point-types.html)) и связано это с тем, что в MySQL для обработки Float-значений используется стандарт IEEE 754 (https://dev.mysql.com/doc/internals/en/floating-point-types.html), о котором можешь почитать в википедии (https://ru.wikipedia.org/wiki/%D0%A7%D0%B8%D1%81%D0%BB%D0%BE_%D0%BE%D0%B4%D0%B8%D0%BD%D0%B0%D1%80%D0%BD%D0%BE%D0%B9_%D1%82%D0%BE%D1%87%D0%BD%D0%BE%D1%81%D1%82%D0%B8).

- - - Добавлено - - -

UPD: Кстати, говоря о Decimal, забыл упомянуть, что вывести данные можно и так:

SELECT cast(/*тут столбец с твоим значением*/ AS decimal(9, 6)) FROM `таблица`
Если вкратце, то тут ты переводишь из Float в Decimal, указывая в "decimal(16, 6)", что всего нужно отобразить 16 знаков, из которых 6 знаков будут после точки.
"16" там стоит из расчёта на то, что 10 символов может быть до точки и 6 символов после. Если указать, например, "7, 6", а в столбце окажется значение "11.123456", то MySQL уже вернёт неправильное значение (обычно это отрицательное число, состоящее из всех девяток. И количество девяток до/после точки будет зависеть от той "формулы", которую ты указал в скобках после decimal. Для запроса с "decimal(7, 6)" и значением столбца в "11.123456", MySQL вернёт "-9,999999", а для "decimal(6, 6) вернёт "-0,999999"")

Paradox
15.06.2018, 17:21
Попробуй вывести так:

SELECT format(/*тут столбец с твоим значением*/, 7) FROM таблица

Если в первом посте ты привёл лишь пример, который сочинил на ходу, а на деле говоришь о том, что в базе значение округляется, то "проблема" заключается в том, что ты не указываешь сколько знаков после точки нужно отображать, а по умолчанию в MySQL выводит, если мне память не изменяет, только два знака после точки. Когда ты делаешь запрос на отображение значения, MySQL не просто отображает число, обрубая все "лишние" значения после точки, а преобразует его в тот вид, который требуется (соответственно, округляя).

А вообще, если нужна точность, то следует использовать тип "Decimal (https://dev.mysql.com/doc/refman/5.5/en/fixed-point-types.html)", ибо в MySQL типы "Float" и "Double" хранят приблизительные значения числа (об этом написано тут (https://dev.mysql.com/doc/refman/5.5/en/floating-point-types.html)) и связано это с тем, что в MySQL для обработки Float-значений используется стандарт IEEE 754 (https://dev.mysql.com/doc/internals/en/floating-point-types.html), о котором можешь почитать в википедии (https://ru.wikipedia.org/wiki/%D0%A7%D0%B8%D1%81%D0%BB%D0%BE_%D0%BE%D0%B4%D0%B8%D0%BD%D0%B0%D1%80%D0%BD%D0%BE%D0%B9_%D1%82%D0%BE%D1%87%D0%BD%D0%BE%D1%81%D1%82%D0%B8).

- - - Добавлено - - -

UPD: Кстати, говоря о Decimal, забыл упомянуть, что вывести данные можно и так:

SELECT cast(/*тут столбец с твоим значением*/ AS decimal(9, 6)) FROM `таблица`
Если вкратце, то тут ты переводишь из Float в Decimal, указывая в "decimal(16, 6)", что всего нужно отобразить 16 знаков, из которых 6 знаков будут после точки.
"16" там стоит из расчёта на то, что 10 символов может быть до точки и 6 символов после. Если указать, например, "7, 6", а в столбце окажется значение "11.123456", то MySQL уже вернёт неправильное значение (обычно это отрицательное число, состоящее из всех девяток. И количество девяток до/после точки будет зависеть от той "формулы", которую ты указал в скобках после decimal. Для запроса с "decimal(7, 6)" и значением столбца в "11.123456", MySQL вернёт "-9,999999", а для "decimal(6, 6) вернёт "-0,999999"")

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

- - - Добавлено - - -

отпишусь

- - - Добавлено - - -

Что-то я не очень понял походу.. как правильно записывать все ибо у меня нечего не получилось..

- - - Добавлено - - -

Разобрался, close theme..

DeimoS
16.06.2018, 10:54
Записывать как и раньше (если Float), а получать нужно указывая количество знаков после точки.
Закрыто.