Программирование, Путешествия, Покер

Последний пост:1 апреля
810
Статистика
Всего постов
3225
845,096 просмотров
Новых постов
+0
1 в день
Лучшие посты автора
27.09.2022 +233
21.12.2019 +196
22.02.2023 +169
04.01.2023 +166
13.07.2019 +154
Лучшие посты читателей
inpace +111
justpus7 +98
vsobakekot +88
Gtrdy +85
s4ekotilla +78
Самые активные читатели
1 87 107 108 109 110 129 162
  • Почему для денежных расчетов нельзя использовать double?

    95/129
    Ответить Цитировать
    1
  • public class doublePrecision {

        public static void main(String[] args) {

              double total = 0;

              total += 5.6;     

              total += 5.8;

              System.out.println(total);  

        }

    }

     

    Result: 11.399999999999

    Сообщение отредактировал Algoritmik - 15.7.2021, 23:16
    17/22
    Ответить Цитировать
    3
  • Algoritmik, а если округлить до двух знаков после запятой?

    9/12
    Ответить Цитировать
    0
  • Цитата (Algoritmik @ 15.07.21)  

    public class doublePrecision {

        public static void main(String[] args) {                       double total = 0;

              total += 5.6;     

              total += 5.8;

              System.out.println(total);  

        }

    }

     

    Result: 11.399999999999

    Проверил на Go, тоже самое. Прикольно, я не знал, так как очень мало с флотами/даблами работал и никогда не имел дел с деньгами (видимо как и тот индус).

    96/129
    Ответить Цитировать
    0
  • Algoritmik, а если округлить до двух знаков после запятой?

    А если таких операций миллионы? Сотни миллионов? А если мы вычитаем? А проценты? Деривативы? Там много таких "если"...

    18/22
    Ответить Цитировать
    0
  • Ну, там есть приколы и другого рода. Например, следующий код выведет в консоль true как раз из-за того, что на больших числах точность вычислений - понятие довольно условное.

    double first = 9_000_000_000_000_000_000.0;
    double second = 100.0;
    double sum = first + second;
    System.out.println(first == sum);

    Можно подробнее почитать на эту тему например на stackoverflow

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

     

    очень мало с флотами/даблами работал и никогда не имел дел с деньгами

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

    Сообщение отредактировал strkk - 15.7.2021, 23:49
    782/1049
    Ответить Цитировать
    4
  • Цитата (strkk @ 15.07.21)  

    почему для денежных расчетов не надо использовать double

    Ну это скорее стереотип, все зависит от конкретной задачи. Например, в API Interactive Brokers спокойно используется тип double везде. Но на интервью лучше отвечать конечно стандартным образом, что использовать double при работе с деньгами не следует.

    3/15
    Ответить Цитировать
    0
  • Цитата (spirit83 @ 16.07.21)  

    Например, в API Interactive Brokers спокойно используется тип double везде.

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

     

    Апи - это просто интерфейс, который как раз и призван скрывать детали реализации. Любая апишка будет принимать (и отдавать) дабл, т.к. это стандартный тип данных, но, еще раз повторюсь, это ровно никак не говорит о том, каким образом там идут вычисления или, например, на каком языке у них написан бэкенд.

    783/1049
    Ответить Цитировать
    3
  • double - это тип с которым умеет работать проц, любая современна апишка как правило принимает json запрос в котором нет типов как таковых, просто строка

     

     

    {

    "id": 1000,

    "value":23.98432

    }

     

    и представлено в виде строки, если бек работает с деньгами он переложит это в тип fixed-point а не в double

    5/12
    Ответить Цитировать
    0
  • Цитата (strkk @ 16.07.21)  

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

    Это конечно да.

    Цитата (strkk @ 16.07.21)  

    Любая апишка будет принимать (и отдавать) дабл, т.к. это стандартный тип данных

    Нет, это необязательно. Всегда можно в интерфейс добавить кастомную структуру или тип данных, если стандартный тип не устраивает. Сам тип double хранит данные с некоторой погрешностью и если эта погрешность неприемлема вводится другой тип.

    Цитата (strkk @ 16.07.21)  

    но, еще раз повторюсь, это ровно никак не говорит о том, каким образом там идут вычисления или, например, на каком языке у них написан бэкенд

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

     

    Ну и это только один из примеров. В торговых симуляторах тоже часто используют просто double и специальные техники чтобы уменьшить погрешность.

    4/15
    Ответить Цитировать
    0
  • Цитата (strkk @ 15.07.21)  

    Забавно, что сегодня собеседовали чувака из индийского амазона. Очень слабый кандидат, мало на что ответил, не смог обычный REST-эндпоинт написать и рассказать, почему для денежных расчетов не надо использовать double. При этом я даже не беру вещи, которые можно списать на знание именно джавы (хотя, например, чел не знал что equals и hashCode надо переопределять вместе, а это прям базовая база)

     

    А тупее всего то, что на бумаге этот чел - SDE II, а на такой же уровень оценили меня после собеса в ноябре. Зачем так жить       

    Ничёсе, это же вопросы для Junior lvl.

    А мне интересно, был ли он в чём-то хорош? Может он дизайн расписал хорошо или процессы отлично налаживает?

    17/19
    Ответить Цитировать
    1
  • Цитата (spirit83 @ 16.07.21)  

    Сам тип double хранит данные с некоторой погрешностью

    Это как тип может хранить данные с погрешностью?) Допустим у нас работа с курсами валют, точность до 4 знака после запятой, правила округления определены цб, используя дабл мы теряем значение в крайнем порядке только из-за использования неправильного типа данных, но полученный дабл мы можем переложить например в bigdecimal для java, выполнить рассчеты и так же округлить до требуемого значения, но уже без потерь в точности, за которые я подозреваю финансовую организацию поимеет регулятор и я могу представить, что дабл в вычислениях где-то  используется только из-за присущей некоторым специалистам халатности

    9/15
    Ответить Цитировать
    0
  • Интересная история была связанная с double

     

    из-за того, что

     

     

    получилось вот такое:

     

    6/12
    Ответить Цитировать
    1
  • 7/12
    Ответить Цитировать
    0
  • Цитата (spirit83 @ 16.07.21)  

    Ну и это только один из примеров. В торговых симуляторах тоже часто используют просто double и специальные техники чтобы уменьшить погрешность.

    это если торговый симулятор написан через жопу, и их начинал писать индус из собеса автора, все грамотные симуляторы для работы с деньгами используют fixed point

    8/12
    Ответить Цитировать
    0
  • Интересная статья на хабре про собеседования – https://habr.com/ru/post/534902/


    Больше всего меня удивил момент, где они дают программисту на тестовом периоде делать задания, которые уже сделаны :thinking:

     

    Избыточные задания

    Хоть период и тестовый, но сразу никто кандидата на реальный проект не бросает - а делаем мы вот что. У нас есть пара реальных и уже решённых задач (то есть с точки зрения реальной работы в них нет смысла) - но всё равно даём их кандидату. Эти задачи

    1) опять же выявляют способности кандидата в некоторых специфических областях;

    2) позволяют сравнить кандидата; так как все в компании прошли через эти задачи, можно считать эти задачи эталонными и использовать для сравнения членов команды: кто быстрее, у кого лучше скиллы и так далее (это кстати популярная тема - дать одно задание разным разрабам и смотреть как каждый будет решать его)

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

    7/9
    Ответить Цитировать
    0
  • Цитата (Levind @ 16.07.21)  

    Это как тип может хранить данные с погрешностью?)

    Многие десятичные дроби не имеют точного представляени в типе double, а значит эти дроби хранятся с некоторой погрешностью

     

    Цитата (Levind @ 16.07.21)  

    Допустим у нас работа с курсами валют, точность до 4 знака после запятой, правила округления определены цб, используя дабл мы теряем значение в крайнем порядке только из-за использования неправильного типа данных, но полученный дабл мы можем переложить например в bigdecimal для java

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

    Цитата (valeg @ 16.07.21)  

    это если торговый симулятор написан через жопу, и их начинал писать индус из собеса автора, все грамотные симуляторы для работы с деньгами используют fixed point

    Сильное заявление. Был у меня проект торговый симулятор, написанный не индусами, и везде там использовался тип double и не было никакой необходимости использовать fixed point. А вместе с ним еще был торговый бот и тоже везде использовался тип double, и писали его опять же не индусы.

    5/15
    Ответить Цитировать
    0
  • Ну ты же сам написал, что используются специальные техники для уменьшения погрешности. Это делается уже когда проект большой, а ошибка становится критической. А все из за неправильного типа данных в начале разработки

    9/12
    Ответить Цитировать
    0
  • Цитата (valeg @ 16.07.21)  

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

    Да нет, ошибка не критическая, просто если можно посчитать точнее, почему это не сделать. Кроме того есть случаи, когда просто технически невозможно посчитать точно. Например, нам нужно посчитать среднее арифметическое двух чисел, а эти числа (в любом типе) находятся рядом друг с другом. Для простоты возьмем целый тип, какое среднее арифметическое будет у 2 и 3, 2.5, но оно уже не может быть представлено в целом типе. И так же будет с любым другим типом ограниченной точности. То есть тут никакой тип не поможет.

    6/15
    Ответить Цитировать
    0
  • В целом типе не представишь

    Например в bitshares все деньги хранятся в UINT64, и оговорено, что там лежит в микрорублях значение, точность до микрорублей, и все умножения, деления делаются по детерменированному алгоритму. Это когда изначально проектируется система как надо. В биткоине вроде тоже в сатоши все летает, но это не точно

    10/12
    Ответить Цитировать
    0
1 87 107 108 109 110 129 162
1 человек читает эту тему (1 гость):
Зачем регистрироваться на GipsyTeam?
  • Вы сможете оставлять комментарии, оценивать посты, участвовать в дискуссиях и повышать свой уровень игры.
  • Если вы предпочитаете четырехцветную колоду и хотите отключить анимацию аватаров, эти возможности будут в настройках профиля.
  • Вам станут доступны закладки, бекинг и другие удобные инструменты сайта.
  • На каждой странице будет видно, где появились новые посты и комментарии.
  • Если вы зарегистрированы в покер-румах через GipsyTeam, вы получите статистику рейка, бонусные очки для покупок в магазине, эксклюзивные акции и расширенную поддержку.