Причина, по которой плавающие числа не могут быть сопоставлены со всеми числами, заключается в несоответствии между десятичной и двоичной системой для дробей.
1889.99966796875 - это число, которое является самым близким к 1890 в этой области с плавающей запятой, поэтому самое близкое это число может быть достигнуто с помощью двоичного представления.
Другие типы, такие как десятичные и денежные, используют другие, гораздо более ресурсоемкие методы хранения числа (например, в строке вы можете хранить любое число, но, конечно, это не самый эффективный способ сделать это). математика)
простой пример: 0,3 в моей двоичной системе:
0.1b (inary) would be 0.5 d (ecimal) so too much...
0.01b --> 0.25d (1/4 too little)
0.011 --> 0.375 (1/4 + 1/8 too much)
0.0101 --> 0.3125 (1/4 + 1/16 still too much)
...
0.010011 --> 1/4 +1/32 + 1/64 = 0.296875
Предположим, что моя система имеет 6 бит для представления дроби, 0,296875 будет ближайшим для этой области. Правильное число не может быть достигнуто из-за десятичной / двоичной системы.
Примеры см. Также:
Примеры погрешностей с плавающей точкой
И отличное детальное объяснение ваших проблем можно найти здесь:
http://download.oracle.com/docs/cd/E19957-01/806-3568/ncg_goldberg.html
Еще одно замечание: на самом деле речь идет о несоответствии, а не о «качестве» систем: например, в десятичной записи вы не можете представить точность на 1/3 100%, в то время как в других системах это вполне возможно.