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

    −108

    1. 1
    2. 2
    >>> round(2.675, 2)
    2.67

    Кто-бы мог подумать?
    http://docs.python.org/2/tutorial/floatingpoint.html

    Запостил: Yurik, 30 Октября 2012

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

    • а посмотреть хотя бы decimal.Decimal(2.675), прежде чем постить?
      Ответить
      • Конечно-же посмотрел.
        Почему не так?
        http://ideone.com/Sk6mbO

        РНР
        http://ideone.com/k3zuvz

        Руби
        http://ideone.com/RlHK4a
        Ответить
        • http://ideone.com/Sk6mbO
          Изначально вы округляете float/double (который естественно точно не представим, ибо в знаменателе остается 5). А "проверяете" через decimal из строки. Это корректно?

          По поводу других примеров: лишь хочу сказать, что гарантии на 2.68 нет.
          Ответить
    • О, адреса доков поменялись. Теперь третий питон по умолчанию.
      Ответить
    • Во-первых, никто не гарантирует куда мы округлим. Потому что флоаты. Это нормально.
      http://ideone.com/izjPRy
      Но в этом бухгалерском округлении есть даже что-то особенное - сумма флоатов-то будет ближе к истине.

      Вот и в VB по дефолту работало бухглалтерское округление. Меня это поначалу смущало, но потом я понял что язык был больше ориентирован на бухгалтерию и секретарш, но был изгажен dll-ками, ActiveX, AddressOf ами, классами и возможностью вызвать WinApi.

      VB в макросах под офис был шагом в нужном направлении - там многое из этого убрали.
      А 1С довел идею до совершенства. Совсем не удивлюсь если 1С округляет четные в одну, а нечетные в другую.
      Ответить
    • Резюмируя сказанное выше.
      Это не говно и не баг, а в какой-то мере фича.
      http://ideone.com/J9Emrl

      Убедится в этом можно так:
      /r пример сложения 1000 рандомных чисел с "половинками"
      а) просто сложить
      б) с дефолтным округлением
      в) с тем округлением которые считается "правильным" - например вверх.

      Сравнить какой из джвух способов ближе к истине.
      Ответить
    • А какое округление правильное? Кажется, зависит от чётности цифры, идущей за .5
      Ответить
      • Ну насколько я понял, ОП хотел донести до нас следующее:
        http://ideone.com/Oe1OQ8
        За это я его и плюсанул.
        Ответить
        • Но в доке по питону написано совсем другое... они пишут что там математическое округление (if two multiples are equally close, rounding is done away from 0), и ничего не говорят о том, что они реализовали бухгалтерское округление к ближайшему четному...

          Да хотя оно еще и к нечетному получилось ;)
          Ответить
        • Так я и думал, что там флоатоблядство и корейский рандом, а не банковское округление:
          http://ideone.com/xuDG7N
          Ответить
          • Понятно што рандом.
            Я и имел ввиду когда говорил что это "в какой-то мере фича".
            Ведь в тех случаях где его юзают - важно чтобы было примерно 50/50 (и совсем не важно четные, нечетные) - статистика сделает своё дело.
            Ответить
      • > А какое округление правильное?
        Хочешь устроить холивар? Они все правильные, просто для разных ситуаций.

        > Кажется, зависит от чётности цифры, идущей за .5
        Если бухгалтерское округление - то к ближайшему четному, поэтому зависит от четности цифры, стоящей перед 5. Если арифметическое - то там вроде всегда вверх.
        Ответить
        • Конечно хочет. Вряд ли он не слышал про 5 режимов округления в x87.
          Ответить
        • всегда вверх по модулю

          А бюстгалтерское округление по сути является статистическим округлением для бедных, где берут четность последнего знака вместо равномерно распределенной случайной величины. Угадайте кто придумал так делать...
          Ответить
          • >вместо равномерно распределенной случайной величины.
            Детерминированость не нужна?
            Ответить
    • Ну всё. Это фатальный недостаток. Нужно заводить свой питон, с крестами и шарпом.
      Ответить

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