212 похожих чатов

На сколько безопасно хранить денежные единицы в строке?

16 ответов

13 просмотров

храни в int, если центы/копейки актуально, то 1,23 * 100, а при чтении 123 / 100

Michel Angelo
храни в int, если центы/копейки актуально, то 1,...

А в чем смысл такого усложнения? Зачем хранить в int, если можно во float и округлять до сотых результат? Точно такое же округление, как при операциях с копейками. И не надо 2 поля и *100, /100.

Igor
А в чем смысл такого усложнения? Зачем хранить в i...

Тут вопрос сравнений и репрезентации дробной части, есть decimal который внутри примерно то же что и описано. Ещё есть нюансы с переполнениями из-за которых удобно Инты строкой хранить, но это тип прям экзотические кейсы Все это хорошо описано в интернетах, включая разные варианты правил округления и прочие штуки

Разве после округления результата возникает вопрос сравнения и интерпретации дробной части? Ну т.е. он возникает, когда не учитывается ожидаемая точность дробной части. Согласен, для операций сравнения float, необходимо использовать обертки, которые учитывают шкалу точности. Но это всё же проще, чем два инта.

Почему два инта? Инт один, по сути ты дробную часть смещаешь в целую до нужной точности

Sergey P
Почему два инта? Инт один, по сути ты дробную част...

Понятно, спасибо. Да, так выглядит проще, если мы заранее можем определить точность дробной части какого-то типа значения. Например, географические координаты - 6 знаков после запятой. Биткойны - 8. Но вот как быть с деньгами? 2 или 4 знака? Сколько я слышал, американская бухгалтерия 4 хочет. Процентные значения зачастую склонны иметь разную точность. А для концепта "количество", какую допустимую точность задавать совсем не понятно, она может варьироваться от случая к случаю. Максимальную не задать, потому что инт закончится.

Igor
Разве после округления результата возникает вопрос...

Практически на любом языке попробуйте написать примерно такой код: if(0.1+0.2 == 0.3) { } Результат вас должен удивить.

RadmirT
Практически на любом языке попробуйте написать при...

В этом примере не присутствует учёт ожидаемой точности при сравнении, о чем я упоминал выше.

Igor
В этом примере не присутствует учёт ожидаемой точн...

Не только точность при сравнении, но и накопления ошибки, если считать много и в вычислениях есть операции * и / то вообще беда. Мне один раз даже пришлось делать вычисления в натуральных дробях чтобы это избежать.

RadmirT
Не только точность при сравнении, но и накопления...

Но на накопление ошибки происходит при округлении, не влияет тип данных, а только факт округления, т.е. ошибка будет накапливаться также при пересчёте и сдвиге инта

RadmirT
Не только точность при сравнении, но и накопления...

И как раз при работе с float и конечным округлением результата вы получите меньше ошибку округления, чем если это округление будет происходить после каждой математической операции, как оно станет с интами для репрезентации флоатов

RadmirT
Практически на любом языке попробуйте написать при...

++ Единственный комментарий, который намекает в сторону Arbitrary-Precision Что является must-have при работе с балансами

Michel Angelo
храни в int, если центы/копейки актуально, то 1,...

Меня в своё время удивило, что 16.9 * 100 !== 1690. Надо не просто умножать, но и всё равно потом округлять

Например в том, что для больших float прибавление сотых не будет иметь эффекта вообще. А для очень больших float прибавление даже единиц не будет иметь эффекта.

Roman K
Например в том, что для больших float прибавление ...

Точно так же как и в случае с решением, когда дробные числа сдвигаются, чтобы получить инт. Ограничения на размер типа присутствуют в обоих решениях.

Igor
Точно так же как и в случае с решением, когда дроб...

Очень зависит от того, где писать и где хранить

Похожие вопросы

Обсуждают сегодня

Anyone here suffers from unexplained aural migraines, who would be up for talking for a bit? Doesn't *have* to be aural, but I am not asking about headaches, I mean actual mi...
Martin Rys
55
Привет, нужен совет старших товарищей. Есть глобальная переменная var DefaultDataFolder:string; инициализируем DefaultDataFolder:='a:\_OUT\'; есть примитивная процедур...
Max Otto
14
Вопрос. Теоретический. Есть список команд. Команды отправляю в обработку некой функции, по очереди. Разные команды могут давать разные результаты после обработки. В зависимос...
Serjone
7
Сonst magicTgHTML = (text, entities) => { let processedText = text; let offsetShift = 0; entities.forEach(entity => { const { offset, length, type, url, ...
Андрей
1
Всем вечера. Подскажите как лучше сделать. делаю на Д10 Например будет база данных на SQLite. в ней будет много таблиц. более 50шт Типа справочник. Содержать ID Name Id p...
Андрей Т 🐎
10
Я короче решил скомпилировать Nim в js, я думал он сработает как обычный транслятор. По итогу он мне создал файл с расширением js, и туда поместил кучу кода Вопрос, что это з...
𝕾𝖍𝖆𝖉𝖊 <suspense>
9
я не магистр хаскеля, но разве не может лейзи тип конвертнуться в не-лейзи запросив вычисление содержимого прям при инициализации?
deadgnom32 λ madao
100
подскажите пожалуйста, как мне освободить результат записанный в переменную result? в чем проблема подскажите если МОЖЕТЕ?
Михаил Helper
28
это группа токсиков или тех кто помогает?
Ибрагим
9
мы пытаемся подменить функцию, которая имеет меньше инструкций относительно функции, которой подменяем. https://www.reddit.com/r/jailbreakdevelopers/comments/w06ujy/mshookfun...
Óðinn
6
Карта сайта