2011-12-22 4 views
-1

Можно создать дубликат:
Why can't decimal numbers be represented exactly in binary?Почему 0,1 * 3 = 0,3

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

Так почему же 0,1 * 3! = 0,3?

(заметьте, вопрос о разработке игры и какие поля математики разработчик игры должны быть знакомы с)

+0

несколько дубликатов, поиск по плавающей запятой в вопросах SO – sdcvvc

ответ

3

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

Отдельные цифры двоичного числа разные степени 2 и любое число, таким образом, сумма различных степеней из 2.

0.1 не соответствует степени 2 и не может быть подведен из различных степени 2. Таким образом, его можно представить только с определенной ошибкой. Вы можете найти более подробное объяснение и примеры here

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

1

Это связано с IEEE 754, что означает, что компьютеры хранят номера с плавающей запятой.

С этим представлением 0,1 не может быть даже точно представлено 96-битным поплавком. В то же время это может быть не 0,3, но если последние были, так как 0,1 не могут быть представлены точно, это означает, что умножение его на 3 не даст 0,3 точно.

Смежные вопросы