Почему 0.9 повторяющийся всегда не равен 1

математически, 0.9 повторяющихся может быть показано, чтобы быть равным 1. Этот вопрос, однако, не о бесконечности, конвергенции или математике за этим.

приведенное выше предположение может быть представлено с помощью двойников в C# со следующим.

var oneOverNine = 1d / 9d;
var resultTimesNine = oneOverNine * 9d;

используя код выше,(resultTimesNine == 1d) значение true.

при использовании десятичных знаков вместо этого оценка дает false, но мой вопрос не о разрозненной точности double и десятичный.

поскольку ни один тип не имеет бесконечной точности, как и почему double поддерживает такое равенство, где decimal нет? Что происходит буквально "между строк" кода выше, в отношении того, как oneOverNine переменная хранится в памяти?

2 ответов


Это зависит от округления, используемого для получения ближайшего представимого значения до 1/9. Все может быть в любом случае. Вы можете изучить вопрос о представительности на полезной странице Роба Кеннеди:http://pages.cs.wisc.edu / ~rkennedy / точный-поплавок

но не думайте, что каким-то образом double способен достичь точности. Это не так. Если вы попробуйте 2/9, 3/9 и т. д. вы найдете случаи, когда округление идет в другую сторону. Суть в том, что 1/9 не совсем представима в двоичная плавающая точка. И поэтому округление происходит, и ваши вычисления подвержены ошибкам округления.


что происходит буквально "между строк" кода выше, в отношении способа, которым переменная oneOverNine хранится в памяти?

чем вы спрашиваете называется IEEE 754. Это спецификация, которую C#, это базовая среда выполнения .Net и большинство других платформ программирования используют для хранения и управления десятичными значениями. Это связано с тем, что поддержка IEEE 754 обычно реализуется непосредственно на уровне процессора / чипсета, что делает его оба гораздо более эффективны, чем альтернатива, реализованная исключительно в программном обеспечении, и намного проще при создании компиляторов, потому что операции будут сопоставляться почти непосредственно с конкретными инструкциями ЦП.