За последние 24 часа нас посетили 30884 программиста и 1478 роботов. Сейчас ищут 859 программистов ...

0.1 + 0.2 = 0.3000000000000004

Тема в разделе "Беседы", создана пользователем Walk, 5 дек 2017.

  1. Walk

    Walk Активный пользователь

    С нами с:
    7 сен 2008
    Сообщения:
    452
    Симпатии:
    86
    Почему при работе с цифрами с плавающей запятой встречаются подобные глюки?

    Здесь про этот глюк упоминали, ответ был:
    Где-то можно почитать об этом поподробнее? Этот глюк имеет какое-то техническое название?

    Нашел такой сайт, но возможно где-то также подробно расписано, но на русском?
     
  2. Sail

    Sail Старожил

    С нами с:
    1 ноя 2016
    Сообщения:
    1.593
    Симпатии:
    362
  3. askanim

    askanim Старожил

    С нами с:
    7 апр 2016
    Сообщения:
    2.201
    Симпатии:
    166
    Адрес:
    GABRIEL
    @Walk я думаю число можно обрезать после 2 нулей. :D И глюка не будет используй float (10,2)
     
  4. Fell-x27

    Fell-x27 Суперстар
    Команда форума Модератор

    С нами с:
    25 июл 2013
    Сообщения:
    12.156
    Симпатии:
    1.771
    Адрес:
    :сердА
    Это вот сразу минус 20 тыщ к ценнику от работодателя, особенно, если в проекте есть рассчеты бабла.
    --- Добавлено ---
    Подсказка - глюк работает в обе стороны. Не только в 1.000000001, но и в 0.9999999999.
    --- Добавлено ---
    Автор, для PHP есть расширение, позволяющее производить рассчеты высокой точности. Если они тебе нужны, конечно. Если Погрешность +- 0.1 не критична, можно пользоваться округлениями(не обрезаниями). Если речь идет и рассчетах бабла или каких-то важных величин, то, лучше вообще отказаться от дробей и оперировать целыми числами на уровне минимальной неделимой единицы. Хранить, грубо, не рубли, а копейки.
     
  5. voral

    voral Активный пользователь

    С нами с:
    30 ноя 2017
    Сообщения:
    646
    Симпатии:
    104
    Мне кажется во всех букварях по программированию (по крайней мере раньше) было про это. Именно по этому сравнивать два числа с плавающей точкой не совсем корректно
    PHP:
    1. $floatVar1 = funct1(); // ожидаем 0.02
    2. $floatVar2 = funct2(); // ожидаем 0.02
    3. if ($floatVar1 ==  $floatVar2 echo 'yes';
    правильнее вводить понятие погрешности
    PHP:
    1. $floatVar1 = funct1(); // ожидаем 0.02
    2. $floatVar2 = funct2(); // ожидаем 0.02
    3. if (abs($floatVar1-$floatVar2) < 0.01) echo 'yes';
     
  6. askanim

    askanim Старожил

    С нами с:
    7 апр 2016
    Сообщения:
    2.201
    Симпатии:
    166
    Адрес:
    GABRIEL
    Обычно вся цены фигурируют в decimal(10,2) или флоат. Помню даже когда 1С конфигурацию делали, вся бухгалтерия велась именно в два ноля после запятой.
     
  7. voral

    voral Активный пользователь

    С нами с:
    30 ноя 2017
    Сообщения:
    646
    Симпатии:
    104
    Тут тоже есть подвох. Я работал с биллинговой системой: более 100 тысяч абонентов, льготы, разные коэффициенты, перерасчеты, пени - в итоге в каких либо отчетах эти копейки лезут во все щели. Т.е. тоже надо обдуманно выбирать этап когда округлять до копеек. Но тут уже от задачи зависит
     
  8. askanim

    askanim Старожил

    С нами с:
    7 апр 2016
    Сообщения:
    2.201
    Симпатии:
    166
    Адрес:
    GABRIEL
    @Fell-x27 я даже не разу не видел в бумагах по буху такие цифры. чтобы цены были такие ,000000000001241241241895890123
     
  9. voral

    voral Активный пользователь

    С нами с:
    30 ноя 2017
    Сообщения:
    646
    Симпатии:
    104
    @askanim, а это не для отображения. Это чтоб какие-то отчеты сошлись глобальные. Т.е. округлишь на отдельных операциях, в итоге у тебя баланс не сойдется. А на нескольких миллионах, с сотнями тысяч записей искать пропавшую копейку еще то удовольствие.
     
  10. askanim

    askanim Старожил

    С нами с:
    7 апр 2016
    Сообщения:
    2.201
    Симпатии:
    166
    Адрес:
    GABRIEL
    не, ну это логично.