Для хранения статистических данных мне нужны DECIMAL, FLOAT или DOUBLE?
Я занимаюсь творчеством, но все же хочу серьезно подойти к нему, сайту, на котором проводятся различные тесты. С помощью этих тестов я надеюсь собрать статистические данные.
Некоторые из данных будут включать в себя процент полноты тестов, как они рассчитаны. Я могу легко вычислить процент тестов, но хотел бы, чтобы верные данные возвращались, поскольку я храню различные значения, относящиеся к тестам по завершении.
Большинство значений в PHP-числах с плавающей запятой, поэтому мой вопрос заключается в том, чтобы, если мне нужны истинные статистические данные, я должен сохранять их в MYSQL как FLOAT, DOUBLE или DECIMAL.
Я хотел бы использовать функции MYSQL, такие как AVG()
а также LOG10()
так же как TRUNCATE()
, Чтобы MYSQL возвращал истинные данные, основанные на моих значениях, которые я вставляю, что я должен использовать в качестве выбора столбца базы данных.
Я спрашиваю, потому что некоторые числа могут быть или не быть числами с плавающей запятой, такими как, 10, 10.89, 99.09 или просто 0. Но я хотел бы, чтобы верные и действительные статистические данные были возвращены.
Могу ли я полагаться на математику с плавающей точкой для этого?
РЕДАКТИРОВАТЬ
Я знаю, что это общий вопрос, и я приношу извинения, но для таких нематематиков, как я, я не являюсь экспертом MYSQL, мне бы хотелось получить мнение эксперта в этой области.
Я сделал свое исследование, но я все еще чувствую, что у меня есть туманное суждение по этому вопросу. Еще раз прошу прощения, если мой вопрос не по теме или не подходит для этого сайта.
7 ответов
Эта ссылка хорошо объясняет, что вы ищете. Вот что говорит:
Все эти три типа могут быть определены следующими параметрами (размер, d). Где размер - общий размер строки, а d - точность. Например, чтобы сохранить число типа 1234.567, вы установите тип данных на DOUBLE(7, 3), где 7 - это общее количество цифр, а 3 - количество цифр, следующих за десятичной точкой.
FLOAT и DOUBLE, оба представляют числа с плавающей запятой. FLOAT для одинарной точности, а DOUBLE для чисел двойной точности. Точность от 0 до 23 приводит к 4-байтовому столбцу FLOAT одинарной точности. Точность от 24 до 53 приводит к 8-байтовому столбцу двойной точности DOUBLE. FLOAT с точностью до 7 знаков после запятой и DOUBLE до 14.
Декларация и функционирование десятичной системы аналогичны Double. Но есть одно большое различие между значениями с плавающей точкой и десятичными (числовыми) значениями. Мы используем тип данных DECIMAL для хранения точных числовых значений, где нам нужна не точность, а точные и точные значения. Тип Decimal может хранить максимум 65 цифр с 30 цифрами после десятичной точки.
Таким образом, для наиболее точного и точного значения, десятичный будет лучшим вариантом.
Если вы не храните десятичные данные (т.е. валюту), вы должны использовать стандартный тип с плавающей запятой (FLOAT или DOUBLE). DECIMAL - это тип с фиксированной запятой, поэтому он может переполняться при вычислении таких вещей, как SUM, и будет смехотворно неточным для LOG10.
Нет ничего "менее точного" в двоичных типах с плавающей запятой, на самом деле они будут гораздо более точными (и более быстрыми) для ваших нужд. Иди с ДВОЙНОЙ.
Десятичное число: типы с фиксированной запятой (точное значение). Используйте его, когда вам нужна точная точность, как деньги.
Пример: salary DECIMAL(8,2)
, 8 - общее количество цифр, 2 - количество десятичных знаков. salary
будет в диапазоне -999999.99
в 999999.99
Float, Double: Типы с плавающей точкой (Приблизительное значение). Float использует 4 байта для представления значения, Double использует 8 байтов для представления значения.
Пример: percentage FLOAT(5,2)
, так же как и тип десятичного числа, 5 - это общее количество цифр, а 2 - это десятичные знаки. percentage
будет хранить значения между -999.99
в 999.99
,
Обратите внимание, что они являются приблизительным значением, в этом случае:
- Значение как
1 / 3.0 = 0.3333333...
будет храниться как0.33
(2 десятичных знака) - Значение как
33.009
будет храниться как33.01
(округление до 2 десятичных знаков)
Проще говоря, Float и double не так точны, как десятичные. десятичное число рекомендуется для ввода числа, связанного с деньгами (валюта и зарплата). Еще один момент, на который нужно обратить внимание: НЕ сравнивайте число с плавающей точкой, используя "=","<>", потому что числа с плавающей точкой не точны.
Просто используйте . И не добавляйте «(m,n)». Отображайте числа с подходящей точностью с параметрами форматирования. Не ждите правильных ответов с "=" ; например,float_col = 0.12
всегда будет возвращатьсяFALSE
.
В целях отображения используйте форматирование для округления результатов по мере необходимости.
Проценты, средние значения и т. д. округлены (по крайней мере, в некоторых случаях). Что любой выбор, который вы делаете, иногда будет иметь проблемы.
ИспользоватьDECIMAL(m,n)
для валюты; использовать...INT
для целых чисел; использоватьDOUBLE for scientific stuff that needs more than 7 digits of precision; use
FLOAT` для всего остального.
Трансцендентальные (такие какLOG10
что вы упомянули) будут выполнять свою работу в ; они по существу никогда не будут точными. Можно передать ему аргумент и сохранить результат в .
Этот ответ относится не только к MySQL, но и практически к любой базе данных или языку программирования. (Подробности могут отличаться.)
PS:(m,n)
был удален изFLOAT
иDOUBLE
. Это только добавляло дополнительное округление и другие вещи, которые, по сути, не приносили никакой пользы.
Linger: На сайте, который вы упоминаете и цитируете, есть IMO, некоторая неточная информация, которая запутала меня. В документах, которые я читал, когда вы объявляете число с плавающей запятой или двойное число, десятичная точка фактически НЕ включается в число. Таким образом, это не количество символов в строке, а все используемые цифры.
Сравните документы: "ДВОЙНАЯ ТОЧНОСТЬ (M,D).. Здесь" (M, D) "означает, что значения могут быть сохранены с общим количеством до M цифр, из которых D цифр может быть после десятичной точки. Например, столбец, определенный как FLOAT(7,4), при отображении будет выглядеть как -999,9999 " http://dev.mysql.com/doc/refman/5.1/en/floating-point-types.html
Кроме того, номенклатура вводит в заблуждение - согласно документам: M - это "точность", а D - "масштаб", тогда как веб-сайт использует "масштаб" для "точность".
Подумал, что было бы полезно, если бы кто-то вроде меня пытался сфотографировать. Поправьте меня, если я ошибаюсь, надеюсь, я не читал устаревшие документы:)
Float и Double являются типами данных с плавающей точкой, что означает, что числа, которые они хранят, могут быть точными только до определенного числа цифр. Например, для таблицы со столбцом типа float, если вы храните 7.6543219
будет храниться как 7.65432
, Точно так же Double
тип данных приближает значения, но имеет большую точность, чем Float
,
При создании таблицы с колонкой Decimal
тип данных, вы указываете общее количество цифр и количество цифр после запятой для сохранения, и если число, которое вы сохраняете, находится в указанном вами диапазоне, оно будет сохранено точно.
Когда вы хотите сохранить точные значения, Decimal
это путь, это то, что известно как фиксированный тип данных.