float блеадь!
Я не удивлюсь,если они в следующий раз попытаются выразить цифровые значения через boolean о\
если бы. Через double
а следующий этап -- комплексные числа?
decimal
А если не оплатите, мы ещё и пени начислим!
первый раз вижу, чтоб Мастер словил столько хуев
Один миллион каджилион шажилион пенни
Вот же ж жадные ублюдки!
Ты правда думаешь, что за каждой оплатой сидит человек? Машине нужно, чтобы было ровно 0.0, иначе доступ не даст.
Вот же ж жадная ублюдошная бездушная машина!
Кто-то не умеет сравнивать числа с плавающей точкой
Финансовые значения принципиально нельзя хранить в float. И дело даже не в неточности сравнений и несуществующих долях копейки, а в том что у вас самих в биллинге ничего не будет сходится. Бухгалтера "обожают" расхождение в копейку-две.
Угу поэтому обычно хранят в int в копейках
Для 32-х битового знакового это всего лишь 2 миллиарда копеек. Беззнакового - 4. Как-то не особо много. Беззнаковый 64-разрядный - 18,446,744,073,709,551,615 копеек. Цифра уже внушительнее. Но всего на пару порядков больше "внешнего долга США". (http://www.usdebtclock.org/)
А если тебе суммы побольше придется хранить? =)
А если тебе суммы побольше придется хранить? =)
Использовать два инта!
genius.jpg
genius.jpg
Разумеется decimal нужно использовать
а еще лучше использовать тип money как в нормальных СУБД
Весь интернет утверждает обратное. Если есть decimal - стоит использовать его. Не знаю какие СУБД ты считаешь нормальными, но в MS SQL Server и в My SQL decimal присутствует.
я за нормальную СУБД считаю PostgresQL
Кстати, в decimal при делении таких хвостов как на картинке не будет? И что будет в ситуации вида 1/3*3?
Храниться и считаться будет также (только с большей точностью, без никаких округлений как это в double или float), чтобы ничего не потерять.
Но при выводе можно применить формат, который будет округлять до целой копейки вверх.
Пример с инета:
decimal x = 0.999m;
Console.WriteLine("My amount = {0:C}", x); //My amount = $1.00
То есть в данном случае будет одна копейка. Но я могу ошибаться.
Но при выводе можно применить формат, который будет округлять до целой копейки вверх.
Пример с инета:
decimal x = 0.999m;
Console.WriteLine("My amount = {0:C}", x); //My amount = $1.00
То есть в данном случае будет одна копейка. Но я могу ошибаться.
А по поводу 1/3*3. Сам смотри, что хранится и что выводится:
А, ну то есть никакой магии, просто не будет в конце артефактов из-за перевода 2-10. Хотя, девятки в конце можно было бы и нулями заменять...
Да Вы же герой, даже в картинках всё пояснили, спасибо! Хотя, можно было бы и ссылку на ideone дать.
Да Вы же герой, даже в картинках всё пояснили, спасибо! Хотя, можно было бы и ссылку на ideone дать.
Не, если девятки нулями заменить - точность потеряется. А в точности весь прикол этого типа данных. Для всяких банковских рассчетов или, не знаю, форексов и прочих биржевых операций это критично. То есть для системы это все-таки чуть меньше доллара, а для пользователя - тупо один бакс.
Тогда можно добавить столько нулей, сколько нулей в числе транзакций до сверки бухгалтером... Впрочем, 0.9999... - нечастая ситуация, да.
Вообще, хорошо бы хранить погрешности вместе с числом и чтоб библиотеки это поддерживали. Потом бухгалтер видит, что копейка набралась из-за миллиарда продаж по акции "вся херня в три раза дешевле".
Вообще, хорошо бы хранить погрешности вместе с числом и чтоб библиотеки это поддерживали. Потом бухгалтер видит, что копейка набралась из-за миллиарда продаж по акции "вся херня в три раза дешевле".
А за ideone большое спасибо. Сколько живу, а про него не слышал, лол.
Сейчас вообще столько полезных онлайн-инструментов, что удивляешься, до чего дошёл прогресс. Например, gcc.godbolt.org, coliru.stacked-crooked.com или сервис, который показывает, как выглядит сайт в 100500 браузерах.
Помню, где-то на хабре обсуждался подобный сервис, который для каждой подобной демонстрации запиливал отдельную виртуальную машину(!) и там что-то запускал.
Киберпанк это, если я не путаюсь в терминах. Сидишь в деревенском сортире, а на смартфоне в браузере отображается какая-нибудь дизайнерская фигня, которая только что отрендерелась у 1000 твоих коллег с простаивающими ПК.
Помню, где-то на хабре обсуждался подобный сервис, который для каждой подобной демонстрации запиливал отдельную виртуальную машину(!) и там что-то запускал.
Киберпанк это, если я не путаюсь в терминах. Сидишь в деревенском сортире, а на смартфоне в браузере отображается какая-нибудь дизайнерская фигня, которая только что отрендерелась у 1000 твоих коллег с простаивающими ПК.
Теперь весь реактор знает, что ты Павел, Павел :3
А это не мой комп лол
вы не понимаете суть проблемы с float'ом. Он хранит число как целое двоичное число в целой двоичной степени. Проблема в том, что не существует целого двоичного числа в целой двоичной степени, соответствующего, например, десятичному числу 0.1 (десяти копейкам). Попытка записать 0.1 в float переменную приведёт к тому что туда будет записано что-то вроде 0.0999999999999, но отображаться оно будет в большинстве случаев с округлением до 0.01. Если много раз сложить суммы с 10 копейками, то эта погрешность накопится, и рано или поздно достигнет значений, при которых последняя копейка начнёт округляться в другую сторону.
9 в периоде не бывает в природе
Во-первых, погрешность, о которой я говорю, накапливается именно из-за того что там не 9 в периоде, а большое, но конечное число девяток после запятой.
Во-вторых, 9 в периоде, как и вообще что угодно в периоде, это вполне конкретные и точные величины. Например 0,(3) = 1/3, а 0,(9) = 1. А уж единица-то в природе точно бывает.
Во-вторых, 9 в периоде, как и вообще что угодно в периоде, это вполне конкретные и точные величины. Например 0,(3) = 1/3, а 0,(9) = 1. А уж единица-то в природе точно бывает.
Оплатить надо "под расчёт"?
Сдача будет?
Вот кстати да. Придти к ним, заплатить рубль и потребовать сдачу в 0,99530000000429 рубля. Или налом, или переводом через банк.
а банк еще, за твой платеж в 1 руб., потребует 25 руб. "за обслуживание"
копейка рубль бережет
Тут скорее микрокопейка миликопейку бережет будет уместнее...
а если не оплатишь то мы ещё коллекторов вызовем)
И что же они заберут такое на эту сумму?
душу
А если должник рыжий?
Телом возьмут. Лишние органы не бывают лишними.
И какой же орган стоит 0,0046999999999571 рублей? Миллиграмм почки?
могут мамку изнасиловать. прецеденты то есть
Нет, они заберут целую почку, вырежут, продадут, из полученной сумы вычтут 0,0046999999999571, а сдачу отдадут тебе.
Ногти состригут.
Почешут спину, счёсанное заберут.
Я что-то пропустил?Медведев ввел в обиход нанорубль и нанокопейки?
Когда взял на работу психа-швейцарца.
Сначала подумал что это биткоин и что мол что тут удивительного ведь 1 биткоин стоит под 600 долларов.
Хех, вспомнил похожий случай у нас в страховой компании (сам операционистом работаю). Приходит доплата, на форме 0.01. Думаю - опечатка, что ли, агенты те ещё существа, а потом смотрю на квитанцию - реально 1 копейку человек доплачивает.
И самое прикольное - агент даже получает долю с этой копейки, судя по форме. КВ (коэффициент вознаграждения) - 20%! 20, Карл!
И самое прикольное - агент даже получает долю с этой копейки, судя по форме. КВ (коэффициент вознаграждения) - 20%! 20, Карл!
Чтобы написать коммент, необходимо залогиниться