1. Python / Говнокод #13497

    −89

    1. 1
    amount_in_cents = int(100 * amount)

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

    По такой формуле вычисляется сумма в центах, которую клиент должен заплатить за товар.

    Прикол в том, что если товар стоит 36.91 евро, то
    * amount = 36.91
    * 100 * amount = 3690.9999999999995
    * int(100 * amount) = 3690

    И клиент платит всего лишь 36.90!

    Запостил: asolntsev, 28 Июля 2013

    Комментарии (15) RSS

    • > * 100 * amount = 3690.9999999999995
      > * int(100 * amount) = 3690
      Эх, в Эльдорадо бы подобное округление...
      Ответить
      • У них же вроде цены всегда заканчиваются на пачку девяток? Я думал, что это маркетинговый код, а они оказывается просто хранят цены во флоатах. ;)
        Ответить
        • А я-то думал, почему кассиры так удивились, когда дали мне рубль сдачи, а я его таки взял...
          Ответить
    • round?
      Ответить
    • decimal?
      Ответить
    • > чуваки решили хранить все суммы в центах.
      А почему тогда количество во флоате?
      Ответить
    • "чуваки решили хранить все суммы в центах. "

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

      вроде же в питоне есть decimal'ы, которые вроде и fixed point поддерживают? работы правильное денежное округление прикрутить (кастом класс?) минут пять - и потом может быть неделя пыхтения перевести всю денежную математику на свой класс. (хотя в некоторых областях/регионах fixed point тоже не катит и народ пользуется базовым arbitrary precision floating point.)
      Ответить
    • Сейчас я скажу хуйню:
      Стоимость нужно хранить в string'ах.
      Ответить
      • Как сказал бы один хороший человек, стринги - для питушков и тормазят.
        Ответить
        • Как сказал бы один хороший человек, фитон - для анскиллябр заедушных, которые не осилили C.
          Ответить
    • Хранить в центах, в принципе, неплохая идея. Точку в нужном месте несложно поставить. Только тогда уж везде нужно центы использовать, включая базу данных.
      Ответить
      • Не, тут базу придется переделывать, а я уже в пижаме....
        Ответить
    • Я еще круче умею
      def f(val):
      i, d = str(val).partition('.')[::2]
      return int(i)*100 + (int(d) if c else 0)
      Ответить

    Добавить комментарий