Подтвердить что ты не робот

Как работает Double.intValue()?

Этот код

Double dbl = 254.9999999999999;
Integer integ = dbl.intValue();
System.out.println(integ);

показывает 254, но один "9" больше

Double dbl = 254.99999999999999;
Integer integ = dbl.intValue();
System.out.println(integ);

и это уже 255.. Почему?

4b9b3361

Ответ 1

Чтобы узнать точное значение вашего двойника, вы можете использовать BigDecimal:

System.out.println(new BigDecimal(254.9999999999999));
System.out.println(new BigDecimal(254.99999999999999));

печатает:

254.9999999999998863131622783839702606201171875
255

Итак, это просто из-за (ограничений) двойной точности...

Ответ 2

System.out.println(254.9999999999999 == 255.0);
System.out.println(254.99999999999999 == 255.0);

печатает

false
true

Это должно дать вам подсказку. Тип double может представлять до 16 значащих цифр, а ваш литерал имеет 17. Следовательно, значение double, ближайшее ко второму десятичному литералу, равно 255.0.

Для второй строки кода Eclipse действительно выдает предупреждение:

Сравнение идентичных выражений

поскольку он уже является компилятором, который знает, что это всего лишь два литерала для одного и того же значения double.

Ответ 3

Двойной - это 64-битное двоичное представление чисел с плавающей запятой. Двоичные числа с плавающей запятой не могут точно представлять большинство десятичных дробей. Они могут точно представлять 1/2, 1/4, 1/64 + 1/32 и т.д., Но они не могут точно представлять 0,9 или 0,1. Кроме того, их точность ограничена.

В вашем случае 254.99999999999999 имеет то же представление, что и 255.0 внутри. Вы можете это увидеть, проверив шестнадцатеричную версию двоичной дробной части, используя метод Double.toHexString. Поскольку 254.99999999999999 уже равен 255.0, когда вы отрезаете дробную часть, отбросив ее до 32-битного целого числа, вы получите 255.

System.out.println("a: " + Double.toHexString(254.99999999999999d));
System.out.println("b: " + Double.toHexString(255d));

Выход

a: 0x1.fep7
b: 0x1.fep7

Ответ 4

Ответ довольно прост. Десятичное число, которое вы написали в коде с одним 9, ближе к двойнику, которое представляет ровно 255, чем любой другой двойной. Таким образом, двойник, который используется в компиляции, в точности равен 255. В то время как десятичное число с одним 9 меньше оптимально представлено двойным отображением ниже. Это означает, что он находится ближе к этому конкретному двойнику, чем любой другой двойной.

Посмотрите эту демонстрацию: http://ideone.com/hSqJTJ

Это вывод:

Original double: 254.9999999999999
Cast to int: 254
Exact double: 254.9999999999998863131622783839702606201171875

Original double: 255.0
Cast to int: 255
Exact double: 255

Ответ 5

двойной двоичный формат - знак (1) + показатель (11) + дробь (53). Бинарная форма для 254.9999999999999 и 254.99999999999999 равна

0 10000000110 1111110111111111111111111111111111111111111111111100
0 10000000110 1111111000000000000000000000000000000000000000000000

мы можем получить его как Long.toString(dbl.doubleToLongBits(dbl), 2);

целочисленная часть

1111110
1111111

ведущий 1 бит опускается, поэтому фактические целочисленные значения

11111110 - 254
11111111 - 255

обратите внимание, что приведение double к integer выполняется не округлением, а усечением