Я хотел бы понять, как я в этой части коды заканчивается время 99999904
99999904 имеет более простое представление в двоичном, чем 99999900 (использует меньше значащие цифры), а так как последние потребности более значимые цифры, чем могут быть сохранены в float, Java должна использовать ближайшее представимое значение.
99999900 in hex: 0x5F5E09C
What 24 significant binary digits look like in hex:
0x7FFFFF8
99999904 in hex: 0x5F5E0A0
Между двумя ближайшими представимых значений 0x5F5E098 и 0x5F5E0A0, Java выбрал последний в соответствии с “nearest-even” правилом. Два представляемых значения на самом деле одинаково близки, но 0x5F5E0A0 имеет 0 для последней значащей цифры и поэтому выбирается в соответствии с этим правилом. Вы можете сами убедиться, что 99999899 округляется до 0x5F5E098 и 99999900 раундов до 0x5F5E0A0.
С 24 значащими двоичными цифрами до типа float
все целые числа от 0 до 2 -1 могут быть представлены точно. 2 случается быть также представимо в точности (он имеет только один значащий разряд), но 2 + 1, или 16777217, не представима в точности как float
и целые числа над ним не автоматически точно представимы в виде float
или.
Попробуйте 'System.out.println (99999900f);' –
9.9999904E7 Самый короткий комментарий, когда-либо так объясняющий! Все ли плавающие числа хранятся в этом формате? i с 1 цифрой до десятичного знака? Спасибо – Randy
Nevermind, только что испытал пару, кажется, что по мере того, как число растет, мы сохраняем больше цифр в десятичных знаках, вероятно, так, чтобы мы могли вместить большее число, чем размер плавающего. Еще раз спасибо – Randy