numeric - Данный тип следует выбирать для хранения денежных сумм, а также в других случаях, когда требуется гарантировать точность вычислений.
Ни раз встречал программистов которые вместо numeric в PostgreSQL использовали double. Так же и в MySQL знакомый всегда использует double для тех же денег. Слышал что есть обсуждения насчет не точности double, но как вижу все его используют и не парятся. Хотелось бы спросить зачем нам нужен numeric тогда если есть real или double?
Хотелось бы узнать зачем неточные типы когда есть точные?
- 835
-
Хотелось бы спросить зачем нам нужен numeric тогда если есть real или double? Вообще более естественным был бы обратный вопрос - нахрена неточные типы, когда есть точные. Но, судя по всему, Вы имеете ответ на этот вопрос... – Akina Jun 29 '19 at 08:37
-
@Akina я новичок поэтому и спрашиваю, хотелось бы узнать зачем неточные типы когда есть точные? – Mike Mclaren Jun 29 '19 at 09:42
-
зачем неточные типы когда есть точные? А с ними математика быстрее. – Akina Jun 30 '19 at 17:00
-
@Akina то есть с точными типами операции работают быстрее и существенно возрастает скорость? – Mike Mclaren Jul 01 '19 at 07:33
-
Наоборот. Точные типы медленнее. Но точнее. – Akina Jul 01 '19 at 07:47
1 Answers
melkij=> create temp table doublecalc (v double precision);
CREATE TABLE
melkij=> insert into doublecalc values (0.1), (0.2);
INSERT 0 2
melkij=> select sum(v) = 0.3 from doublecalc ;
?column?
----------
f
Что? Почему условие не выполняется? Потому что числа с плавающей запятой работают именно так (возможно вопрос необходимо вовсе закрыть как дубликат).
Справедливо и для postgresql и для mysql и для многих других. Вообще если вы назовёте float или double что-то не относящееся к IEEE 754 - вас не поймут. А всё основанное на IEEE 754 по своему определению является приближёнными вычислениями. И потому не может применяться в областях, где нужны точные вычисления. Ну и, разумеется, применяются и там тоже, а потом мучительно ищут ошибки. Людям свойственно делать глупости, но это не значит что эти глупости надо повторять.
Поэтому если вы хотите хранить деньги в числах с плавающей запятой - то вы или обосновываете что именно так необходимо сделать именно здесь или получаете больно по рукам при прохождении code review в любом приличном проекте.
- 21,843
-
Тогда получается, что я для денег использую в Postgresql тип numeric т.к мне нужны точные цифры, а где тогда допустим я могу использовать double? – Mike Mclaren Jul 01 '19 at 07:35
-
Там где вам нужны числа с плавающей запятой и при том точности float недостаточно. Поищите в науках, например, где нужны быстрые вычисления и всё равно на +- метр потому что сравниваем километры. – Мелкий Jul 01 '19 at 07:54