Почему это?
Поскольку числа с плавающей запятой хранятся в двоичном формате, в которых 0,3 0,01001100110011001 ... повторяется точно так же, как 1/3 равно 0,3333333 ..., повторяется в десятичной форме. Когда вы пишете 0.3
, вы фактически получаете 0,29999999999999999988897769753748434595763683319091796875 (бесконечное двоичное представление округлено до 53 значащих цифр).
Имейте в виду, что для приложений, для которых с плавающей запятой сконструировано, не проблема, что вы не можете точно представлять 0.3.С плавающей точкой была разработана для использования с:
- физических измерениями, которые часто измеряются только 4 Инжира и никогда более чем 15
- трансцендентные функции, такие как логарифмы и тригонометрических функции, которые все равно приближаются.
Для которых двоично-десятичные преобразования практически не имеют отношения к другим источникам ошибок.
Теперь, если вы пишете финансовое программное обеспечение, для которого $ 0,30 означает точно $ 0.30, все по-другому. Для этой ситуации существуют десятичные арифметические классы.
И как получить правильный результат в этом случае?
Ограничение точности до 15 значащих цифр обычно достаточно, чтобы скрыть цифры «шум». Если вы на самом деле не нуждаетесь в точный ответ, это, как правило, лучший подход.
Идите и прочитайте об этом. Вопросы с плавающей точкой требуют тщательного изучения, чтобы вы не делали опасных ошибок. – Artelius
, чтобы иметь точные значения, вместо этого используйте целые числа (или некоторые bignum lib) const int acc = 100; int tmp, a = 30/acc, b = 0; для (char i = 1; i <= 50; i ++) b = b + a; std :: cout << int (b/acc) << "."; TMP = Ь% соотв; if (tmp <10) std :: cout << "0"; std :: cout << int (tmp); чтобы ускорить работу, вы можете использовать мощность 2 для acc так *, /,% конвертируется в <<,>>, & – Spektre