Сохранение статистических данных, мне нужен DECIMAL, FLOAT или DOUBLE?
Я создаю для удовольствия, но я все еще хочу серьезно подойти к нему, сайт, на котором проводятся различные тесты. С этими тестами я надеюсь собрать статистические данные.
Некоторые из данных будут включать процент полноты тестов по мере их времени. Я могу легко вычислить процент тестов, но я бы хотел, чтобы возвращались истинные данные, когда я храню различные значения, относящиеся к тестам при завершении.
Большинство значений в PHP-поплавках, поэтому мой вопрос заключается в том, что если мне нужны истинные статистические данные, я должен хранить их в MYSQL как FLOAT, DOUBLE или DECIMAL.
Я хотел бы использовать функции MYSQL, такие как AVG()
и LOG10()
, а также TRUNCATE()
. Чтобы MYSQL возвращал истинные данные на основе моих значений, которые я вставляю, что я должен использовать в качестве выбора столбца базы данных.
Я спрашиваю, потому что некоторые числа могут или не могут быть плавающими, например, 10, 10.89, 99.09 или просто 0.
Но я бы хотел, чтобы возвращались истинные и достоверные статистические данные.
Можно ли полагаться на математику с плавающей запятой?
ИЗМЕНИТЬ
Я знаю, что это общий вопрос, и я приношу свои извинения широко, но для таких же не математиков, как я, я тоже не эксперт по MYSQL, я бы хотел получить мнение эксперта в этой области.
Я сделал свое исследование, но я все еще чувствую, что у меня есть омутное суждение по этому вопросу. Опять прошу прощения, если мой вопрос не соответствует теме или не подходит для этого сайта.
Ответы
Ответ 1
Эта ссылка отлично справляется с тем, что вы ищете. Вот что говорит:
Все эти три типа могут быть заданы с помощью следующих параметров (size, 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 для хранения точных числовых значений, где нам не нужны точность, а точные и точные значения. Десятичный тип может хранить максимум 65 цифр, с 30 цифрами после десятичной точки.
Итак, для наиболее точного и точного значения лучшим вариантом будет Decimal.
Ответ 2
Проще говоря, Float и double не так точны, как десятичные. десятичный знак рекомендуется для ввода количества входящих денег (валюта и зарплата).
Еще один момент, который необходимо указать, - это: НЕ сравнивать число с плавающей запятой, используя "=", "< > ", поскольку числа с плавающей точкой не являются точными.
Ответ 3
Если вы не храните десятичные данные (т.е. валюта), вы должны использовать стандартный тип с плавающей точкой (FLOAT или DOUBLE). DECIMAL - тип фиксированной точки, поэтому он может переполняться при вычислении таких вещей, как SUM, и будет нелепо неточным для LOG10.
Нет ничего "менее точного" в отношении двоичных типов с плавающей запятой, на самом деле они будут намного точнее (и быстрее) для ваших нужд. Идите с DOUBLE.
Ответ 4
Linger: веб-сайт, который вы упоминаете и цитируете, имеет IMO некоторую неточную информацию, из-за которой я запутался. В документах я читал, что когда вы объявляете float или double, десятичная точка на самом деле НЕ включена в число. Таким образом, это не количество символов в строке, а все используемые цифры.
Сравните документы:
"ДВОЙНАЯ ТОЧНОСТЬ (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 - "масштаб", тогда как веб-сайт занимает "масштаб" для "точности".
Думал, что это было бы полезно, если бы sb, как я, пытался получить картину.
Исправьте меня, если я ошибаюсь, надеюсь, что я не прочитал некоторые устаревшие документы:)
Ответ 5
Десятичный: типы с фиксированной точкой (точное значение). Используйте его, когда вам нужна точная точность, например деньги.
Пример: 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 знаков после запятой)