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

Почему Double.parseDouble делает 9999999999999999 до 10000000000000000?

почему Double.parseDouble делает 9999999999999999 до 10000000000000000? Например:

Double d =Double.parseDouble("9999999999999999");
String b= new DecimalFormat("#.##").format(d);
System.out.println(b);

Печать в режиме

10000000000000000

вместо этого он должен показывать 9999999999999999 или 9999999999999999.00

Приветствуется всякая помощь.

4b9b3361

Ответ 1

double имеет только 15/16 цифр точности, и когда вы даете ему номер, который он не может представлять (что большую часть времени, даже 0,1 неточно), он принимает самый близкий представляемый номер.

Если вы хотите точно указать 9999999999999999, вам нужно использовать BigDecimal.

BigDecimal bd = new BigDecimal("9999999999999999");
System.out.println(new DecimalFormat("#.##").format(bd));

печатает

9999999999999999

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


Вы можете найти наибольшее представимое целое число с

// search all the powers of 2 until  (x + 1) - x != 1
for (long l = 1; l > 0; l <<= 1) {
    double d0 = l;
    double d1 = l + 1;
    if (d1 - d0 != 1) {
        System.out.println("Cannot represent " + (l + 1) + " was " + d1);
        break;
    }
}

печатает

Cannot represent 9007199254740993 was 9.007199254740992E15

Наибольшее представимое целое число - это 9007199254740992, так как ему нужен один бит (как четный)

Ответ 2

Число 9999999999999999 находится чуть выше префикса точности с плавающей запятой с двойной точностью. Другими словами, 53-битная мантисса не может удерживать 9999999999999999.

Таким образом, результат округляется до ближайшего значения двойной точности - 10000000000000000.

 9999999999999999 = 0x2386f26fc0ffff  // 54 significant bits needed
10000000000000000 = 0x2386f26fc10000  // 38 significant bits needed

Ответ 3

9999999999999999 требуется 54 бит мантиссы для того, чтобы быть представленными точно, а double имеет только 52. Таким образом, число округляется до ближайшего числа, которое может быть представлено с использованием 52-битной мантиссы. Это число 10000000000000000.

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

Подробное объяснение подобной проблемы см. в Почему (длинный) 9223372036854665200d дает мне 9223372036854665216?