1. Java / Говнокод #18963

    −39

    1. 1
    2. 2
    3. 3
    4. 4
    5. 5
    6. 6
    x1 = x1 * 1000;
    x2 = x2 * 1000;
    int i = (int) Math.round(x1);
    int i2 = (int) Math.round(x2);
    x1 = (double) i / 1000;
    x2 = (double) i2 / 1000;

    Ограничиваем вывод тремя знаками после запятой

    Запостил: Actine, 03 Ноября 2015

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

    • Стандартный приём.*

      *В среде тех, кто не знает про String.format
      Ответить
      • говно если это только для вывода.

        в одной финансовой системе подобный трюк делался что бы отрезать малозначимые цифры после н-ой позиции.
        Ответить
        • > финансовой системе
          > double
          Ответить
          • fixed point не катит потому что арифметика просто не работает (классический пример это подсчет налогов: считать надо с более высокой точностью, а потом надо округлять).

            arbitrary precision числа просто в жопу тормозят. в паре мест народ пробовал - но потом выкинули. и не совсем они уже и такие arbitrary: те либы которые я смотрел (какие уже не помню, gmp?) точность можно просто конфигурировать.
            Ответить
            • > точность можно просто конфигурировать
              Ну дык это и есть arbitrary. Т.е. именно та точность, которая требуется в твоей задаче, а не диктуемая процессором/компилятором/библиотекой.
              Ответить
              • точности дабла для представления платежей хватает.

                и она не диктуется "процессором/компилятором/библиотекой", а стандартом IEEE 754.

                я тоже возмущался. и только после того как работу поменял, столкнулся с arbitrary precision либама. думал что что-то улучшат. на тестах которые гонял, по сравнению с даблом погрешность стабильно была меньше 1e-10. а работают в десятки разов медленее. я был весьма разочарован. и обрадован что дабла хватает и парится не надо.
                Ответить
                • > в десятки разов медленее
                  Вот из-за таких горе-оптимизаторов людям потом и приходят счета на 0 рублей 00 копеек...
                  Ответить
                  • скажи спасибо что счет не на +Inf рублей. ;-)
                    Ответить
                    • Ну я серьёзно. Это ж ёбаное минное поле, где все десятичные дроби, даже банальнейшие 0.1 и 0.2, имеют по два корявых представления, выбираемых по воле случая... Перед каждым сравнением перегоняете в фикседы или строки с нужной точностью? Или как?

                      Я не знаю, как даблы в финансовые расчёты вообще допустили.
                      Ответить
                      • > Я не знаю, как даблы в финансовые расчёты вообще допустили.

                        Это оно так было в моем проекте. Но у меня там большинство было копеешные расчеты. Почему округление и делалось: когда например из 25 центов вычитаешь 7.5% какой скидки, а потом налагаешь 11% налога, числа получаются совсем не круглые.

                        Большие финансовые пакеты (типа того же asset depreciation) пользуются fixed'ами, подобно тому что реализуют теже RDBMSы. (Банковский софт я не знаю чем пользуется - от них числа всегда строками в XML приходили/к ним уходили.) Но им как бы и не надо десятки миллионов транзакций в час обрабатывать, и как правило извратов с мелкими суммами и/или с налогами тоже не надо делать. (И даже в банковском софте, где у тебя может быть и есть миллионы транзакций, транзакции в real-time не обрабатываются - они аккумулируют батчи, и их по мере накопления обрабатывают.)
                        Ответить
                        • > десятки миллионов транзакций в час
                          А они точно упираются не в парсинг, не в сеть, не в диск, а в сраную арифметику?
                          Ответить
                          • Этого ни ты ни я мы наверное уже никогда не узнаем. :-/

                            Но архитекты говорили, что тормозит порядочно. И самое главное: конкуреты тоже даблами пользуются. Поэтому - без шансов.
                            Ответить
                            • Это биржа какая-то что-ли? Где ещё такие потоки чисел надо пережёвывать...
                              Ответить
                              • счета и тарифы за использование мобильной связи (pre-paid).

                                ЗЫ что делают на биржах, я бы с удовольствием послушал. только ХЕЗ где найдешь потому что все обложено "trade secret".
                                Ответить
                                • > счета и тарифы за использование мобильной связи
                                  Так вот кто писал эти алгоритмы!

                                  У моего друга забавная история была... Был у него подключен "любимый номер" для девушки. А потом он подключил анлим. В итоге все звонки по 0р (за счёт анлима), а звонки девушке по 0.5 * тариф (за счёт любимого номера). Кто-то ифы не в том порядке поставил :3
                                  Ответить
      • мне это всегда напоминает Перловое говно, где раунд делается через форматирование...
        Ответить
    • Но ведь double не может точно представлять числа, у которых в знаменателе не степень двойки!
      Ответить

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