Почему 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
Приветствуется всякая помощь.
Ответы
Ответ 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?