Странное поведение с плавающей точкой в программе Java [дубликат]

На основе документации :

Каждая точка данных в Google Fit имеет связанный источник данных. Источники данных содержат информацию для идентификации приложения или устройства, которое собирает или преобразовывает данные. Имя пакета приложения доступно для источников данных, которые не представляют физический датчик.

Google Fit позволяет вам:

  • Определить, в какое приложение были добавлены данные о пригодности.
  • Запустить намерение просмотреть данные о фитнесе с помощью определенного приложения.
  • Получать намерения показывать данные о пригодности с помощью вашего приложения.
blockquote>

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

.

10
задан Barry Kelly 29 November 2008 в 13:52
поделиться

4 ответа

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

Причина состоит в том, что они хранят значения в двоичном формате с плавающей точкой, а не десятичном формате с плавающей точкой. Единственные дробные значения, которые могут быть представлены точно, являются теми, которые являются суммами отрицательных полномочий два. Числа как:

  • 0.5 (2^-1)
  • 0.125 (2^-3)
  • 0.625 (2^-1 + 2^-3)

И т.д.

То, что Вы видите, является тем, что представления чисел как 0,96 не являются точно представимыми, потому что они не являются выразимыми как сумма отрицательных полномочий два. Таким образом, при распечатывании с полной точностью как десятичная дробь они не будут соответствовать исходному значению.

23
ответ дан 3 December 2019 в 13:41
поделиться

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

Существует несколько решений:

  • Масштабирование: если все Ваши числа являются кратными числами 0,01 (например), умножают все на 100 и используют целочисленную арифметику (который точен).
  • Числовой тип: если Ваш язык имеет числовой тип (как a numeric введите в SQL), можно использовать его.
  • Произвольная точность rationals: пользуйтесь библиотекой сверхбольшого числа как GMP, который позволяет Вам представлять эти числа как отношение двух целых чисел.
  • Десятичная плавающая точка: если у Вас есть десятичная плавающая точка как та в IEEE-754r, можно использовать ее.
5
ответ дан 3 December 2019 в 13:41
поделиться

Вы можете хотеть проверить класс java BigDecimal как альтернативу плаваниям и удваиваетесь.

1
ответ дан 3 December 2019 в 13:41
поделиться
Другие вопросы по тегам:

Похожие вопросы: