проблема с плавающей запятой в R?

Возможный дубликат:
Почему эти цифры не равны?

Приведенное ниже выражение, которое оценивается до 0,1, считается больше 0,1.

> round(1740/600,0) - 1740/600 [1] 0.1 > (round(1740/600,0) - 1740/600)  (round(1740/600,0) - 1740/600) <= 0.1000000000000000000000000000000000000001 [1] TRUE 

Думая, что проблема может быть вызвана округлением, я попробовал это с тем же результатом:

 > 3 - 2.9 [1] 0.1 > (3 - 2.9) <=0.1 [1] FALSE 

Итак, что дает и как я могу исправить это, не вымачивая обрезание?

Из руководства по плавающей запятой :

Почему мои цифры, например, 0,1 + 0,2, составляют хороший раунд 0,3, и вместо этого я получаю странный результат, например 0.30000000000000004?

Поскольку внутренне компьютеры используют формат (двоичный с плавающей запятой), который не может точно представлять число, например 0,1, 0,2 или 0,3.

Когда код компилируется или интерпретируется, ваш «0,1» уже округляется до ближайшего номера в этом формате, что приводит к небольшой ошибке округления даже до того, как произойдет расчет.

Что я могу сделать, чтобы избежать этой проблемы?

Это зависит от того, какие вычисления вы делаете.

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

Есть R-функции, которые автоматически принимают разумные подходы к «проблеме равенства»:

 > (3 - 2.9) <=0.1 #[1] FALSE > all.equal( (3 - 2.9) , 0.1) #[1] TRUE 

В качестве порога по умолчанию используется sqrt наименьшего числа положительных чисел с плавающей запятой R, поэтому он обрабатывает ошибки умножения и разложения. Заканчивается около 1е-08

  • Как отключить буферизацию stdout в C
  • Какие операции и функции на +0.0 и -0.0 дают разные арифметические результаты?
  • atoi - как определить разницу между нулем и ошибкой?
  • Передача многомерных массивов в качестве аргументов функции в C
  • Что случилось с этим кодом C 1988 года?
  • локальная переменная, инициализированная нулем в C
  • предупреждение: функция становится опасной
  • Программа для конверсии Фаренгейта в цель
  • Что означает ... означает в списке аргументов в C?
  • Декодирование и проверка токена JWT с использованием System.IdentityModel.Tokens.Jwt
  • Ошибка с плавающей запятой в представлении?
  • Interesting Posts

    Невозможно вставить ячейки в Excel 2010 – сообщение об ошибке «операция не разрешена»

    Как остановить перезагрузку Windows 7 для установки обновлений

    Отладка и производительность релиза

    Как определить модель моей видеокарты?

    Как наложить два аудиофайла с помощью ffmpeg

    Windows 10 перезапускается при попытке спячки

    Как показать конкретный скрытый файл в диалоговом окне браузера файлов – Mac OS X

    Как скрыть / показать больше текста в определенной длине (например, youtube)

    Могу ли я иметь файлы Swift, Objective-C, C и C ++ в одном и том же проекте Xcode?

    Что такое синтаксис версии bower (и npm)?

    Svchost вызывает проблемы

    Массовое переименование файлов в PowerShell с последовательными числовыми суффиксами

    IP-адрес подделан? Как исправить

    Mac Lion OS X – я удалил файлы, но свободное место на диске не увеличилось

    Где установить настройку по умолчанию из папки «/ sys» в Fedora 18?

    Давайте будем гением компьютера.