Почему значение String.format 0.1d равно 0,1 в Java?JAVA

Программисты JAVA общаются здесь
Anonymous
Почему значение String.format 0.1d равно 0,1 в Java?

Сообщение Anonymous »

Числа с плавающей точкой IEEE 754 являются дискретными.

Код: Выделить всё

public class MyTest2 {
public static void main(String[] args) {
//about 1.00000001490116119384765625E-1 in IEEE-754
float f = 0.1f;
//about 1.00000000000000005551115123126E-1 in IEEE-754
double d = 0.1d;
System.out.println(String.format("double 0.1= %.30f", d));
System.out.println(String.format("float 0.1 = %.15f", f));
System.out.println(d+"");
}
}
Посмотрите, как этот код работает на сайте IdeOne.com. При работе в JDK8 результат:

Код: Выделить всё

double 0.1= 0.100000000000000000000000000000
float 0.1 = 0.100000001490116
0.1
Значение с плавающей запятой печатается, как и ожидалось.
Я ожидаю, что двойное значение 0.1d будет напечатано примерно так: 1.000000000000000055511151231260. Почему он печатает
все нули в дробной части
?
Если я конвертирую двойную переменную d в строку, он печатает 0,1.

Код: Выделить всё

System.out.println(d+"");
Как Java преобразует ближайшее значение с плавающей запятой 0,1d (которое имеет размер около 1,00000001490116119384765625E-1) в точное значение 0,1?

Вернуться в «JAVA»