#mysql #floating-point
#mysql #значение с плавающей запятой
Вопрос:
У меня есть столбец с плавающей запятой, который содержит несколько очень маленьких чисел, таких как 0.00000000000234
Когда я выбираю их в MySQL, я получаю их обратно в экспоненциальной нотации, такой как 2.34e-13. Могу ли я каким-либо образом изменить форматирование этих чисел, чтобы заставить MySQL возвращать его как 0.00000000000234?
В конечном счете, что я хотел бы сделать, это изменить отображение, а не базовое представление числа. Так что, вероятно, это будет настройка отображения или форматирования. В MySQL есть функция FORMAT (), но это совсем не то, что я хочу (она помещает числа в формат, подобный 123 456,78).
Комментарии:
1. mysql не форматирует числа, он возвращает фактические значения с плавающей запятой. Какой интерфейс вы используете для отображения результатов?
2. @sehe, на самом деле MySQL форматирует числа в экспоненциальную нотацию, если у вас много нулей перед вашей десятичной дробью (<1). Я получаю этот результат, используя встроенный клиент MySQL. ВЫБЕРИТЕ mycol ИЗ таблицы, ГДЕ id = 1, mycol станет экспоненциальным.
3. Итак,
builtin
клиент (который не встроен, но я понимаю, что вы имеете в виду) выполняет форматирование. Спасибо за разъяснение
Ответ №1:
Вы можете принудительно вернуть число к желаемому формату отображения. Приведите его к достаточно большому десятичному значению, а затем приведите ДЕСЯТИЧНОЕ значение к символу, чтобы получить форму отображения, которая вам нужна. Это чисто отображение и позволяет вам продолжать хранить значения с плавающей точкой в mysql (при желании).
mysql> SELECT CAST(CAST(f AS DECIMAL(14,14)) AS CHAR) AS example from test;
------------------
| example |
------------------
| 0.00000000000234 |
------------------
1 row in set (0.00 sec)
Вы, конечно, потеряете некоторую точность, в зависимости от значения.
Комментарии:
1. Спасибо 🙂 Моя первая награда.
Ответ №2:
Вам следует рассмотреть возможность использования DECIMAL
для хранения этих значений, поскольку все значения с плавающей запятой аппроксимированы и неточны при работе с такими маленькими числами. DECIMAL
Будет отображаться так, как вы хотите.
Комментарии:
1. У меня сложилось впечатление, что значение FLOAT было неточным только в том случае, если у вас много значащих цифр, а не в том случае, если у вас просто очень большое или маленькое число. В этих случаях у меня есть только 3-5 значащих цифр, и я просто занимаюсь хранением и извлечением.
2. Я пробовал использовать десятичную дробь, и это сработало. Я не уверен, что хочу изменить все свои значения с плавающей запятой на десятичные, поэтому все еще надеюсь найти способ изменить форматирование. Но это действительно помогает.
3. На самом деле, если подумать, это не сработает, потому что одним из требований моего приложения является форматирование чисел так, чтобы они содержали произвольное количество десятичных знаков, но не имели завершающих нулей. Так, например, я хочу, чтобы в одном столбце было 2.345 и 4.5, а не 4.500. Поэтому десятичная система счисления для меня не вариант. Мне нужно каким-то образом исключить экспоненциальную нотацию из чисел с плавающей точкой.
Ответ №3:
Вы можете использовать round. т.е.
выберите round (столбец, 10) из foo;