Просмотр полной версии : [Вопрос] Почему MySQL неправильно показывает число после точки для Float-значений?
Доброе время суток, вообще возник вопрос, почему в базу данных записывает 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, "", "");
Почему так? и как сделать так что бы записывало полностью, то что после точки тоже..
%0.xf
x - количество знаков, которые будут выведены после запятой.
Какой тип у этого поля в таблице?
float (lenght 12), если имеет значение то engine InnoDB (format row compact), дело в том что работаю с базами mysql первый раз..
- - - Добавлено - - -
сомневаюсь что оно поможет дело в том что в из GetPlayerPos в переменную записывает корректно, то бишь уже в саму базу запись идет таков.
float (lenght 12), если имеет значение то engine InnoDB (format row compact), дело в том что работаю с базами mysql первый раз..
- - - Добавлено - - -
сомневаюсь что оно поможет дело в том что в из GetPlayerPos в переменную записывает корректно, то бишь уже в саму базу запись идет таков.
А запрос на сохранение/добавление как выглядит?
Это добавление через 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 стоит.
Даже не знаю, было подобное, помогло изменение типа на double.
Попробуй вывести так:
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"")
Попробуй вывести так:
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..
Записывать как и раньше (если Float), а получать нужно указывая количество знаков после точки.
Закрыто.
Powered by vBulletin® Version 4.2.0 Copyright © 2024 vBulletin Solutions, Inc. All rights reserved. Перевод: zCarot