Стандарт IEEE 754 с плавающей точкой представление
0.98123453
составляет 32 бита (знака, ехр, мантиссы):
0 01111110 11110110011001000110000
который является:
0.9812345504760742
с двойной точностью, и отбрасывается в поплавковое десятичное представление:
0.98123455
Число бит, присвоенных одной точности (поплавок), равно 32 и 64 бит для двойной точности. Обратите внимание, что BigDecimal
, который часто предлагается, сохранит ваш номер в виде строки, а не в формате IEEE754. Он будет делать преобразование, когда ему нужно действовать по числу, и, хотя он имеет лучшую точность, он ужасно медленный.
EDIT. Чтобы выяснить, почему он печатает 0.98123455, мы должны заметить, что он является самым близким одинарной точности представление числа 0.98123453:
00111111011110110011001000101111 = 0.9812345 (sp) = 0.9812344908714294 (dp)
00111111011110110011001000110000 = 0.98123455 (sp) = 0.9812345504760742 (dp)
00111111011110110011001000110001 = 0.9812346 (sp) = 0.981234610080719 (dp)
зр = одинарной точности, дп = двойной точности
Перечень является для двоичного диапазона [-1, + 1] вокруг номера, и вы можете видеть, что 0.98123453
ближе всего к суффиксу 10000
мантиссы, а 0.98123452
- ближе всего к суффиксу 01111
.
Не действительно, ни любое другое число десятичных цифр. Он имеет 23 (+1) * бит * точности. Десятичное представление сильно вводит в заблуждение. – harold
Консоль точно не имеет к этому никакого отношения. – EJP