Я прочитал эту ветку переполнения стека и эту публикацию в блоге , но все еще не могу понять, почему некоторые числа с плавающей запятой могут быть представлены именно в двоичном виде, и почему некоторыене могу.
Я понимаю, что 0.1
, 0.2
, 0.3
, 0.4
, 0.6
, 0.7
, 0.8
, 0.9
даст бесконечную дробь вбинарная система как их знаменатели, поскольку ни 10, ни 5 не могут быть представлены степенями два.0.5
однако имеет знаменатель 2^1
.
Когда я добавляю 0.2 + 0.4
, я получаю 0.6000000000000001
, когда я добавляю 0.1 + 0.5
, я получаю 0.6
.Я думал, что это потому, что в первой сумме я добавил две бесконечные дроби, тогда как во второй сумме я добавил с 0.5
, который имеет конечное представление, с 0.1
, который этого не делает.Однако, когда я добавляю 0.3 + 0.4
, я получаю 0.7
, чего я не ожидал, учитывая, что и 0.3
, и 0.4
не имеют точных представлений, и при этом 0.7
.
Я бы подумал, что, поскольку 0.5
является единственным десятичным числом от 0.1
до 0.9
(только в одном десятичном знаке) с конечным представлением, работа с любыми другими десятичными числами даст неточныйпредставление, но это не так.
Почему добавление некоторых десятичных знаков с одной точкой без конечного представления в двоичном виде дает точное представление, а некоторые нет?