Почему этот простой код напечатан на Java так плохо и правильно на C?
Поскольку вы не сравниваете одни и те же операции, вы получите другой результат.
Поведение double
одинаково для разных языков, поскольку оно использует аппаратное обеспечение для выполнения этих операций в каждом случае. Единственная разница заключается в методах, которые вы выбрали для отображения результата.
В Java, если вы запустите
double d = 0;
for (int i = 1; i <= 10; i++)
System.out.printf("%f%n", d += 0.1);
печатает
0.100000
0.200000
0.300000
0.400000
0.500000
0.600000
0.700000
0.800000
0.900000
1.000000
Если вы запустите
double d = 0;
for (int i = 0; i < 8; i++) d += 0.1;
System.out.println("Summing 0.1, 8 times " + new BigDecimal(d));
System.out.println("How 0.8 is represented " + new BigDecimal(0.8));
вы получите
Summing 0.1, 8 times 0.79999999999999993338661852249060757458209991455078125
How 0.8 is represented 0.8000000000000000444089209850062616169452667236328125