0

Есть код:

public class Test {
    public static void main(String[] args) {
        double a = 0.1, b = 0.2, c = a + b;
        System.out.println(c);
    }
}

Я учился в школе и знаю, что с == 0.3, но вот Java так не считает:

0.30000000000000004

Или такой код:

public class Test {
    public static void main(String[] args) {
        double a = 0.1, b = 3.0, c = a * b;
        System.out.println(c);
    }
}

Результат всё равно тот же:

0.30000000000000004

Почему так, что я делаю не так, и как от этого избавиться?

Regent
  • 19,134
  • Потому что компьютер не может представить 0.1 + 0.2 = 0.3 внутри стандартного double в виду его архитектуры. У него есть ошибки точности, которые, если грубо, и позволяют запихнуть такие диапазоны в 32/64 бит. – etki Jul 17 '15 at 08:13

3 Answers3

3

Дело в том, что double - это число 64 битов, и возможно точно определить только 264 разные числа. Поэтому, будут много чисел, без точной репрезентацией в double.

Более того, число 0.30.1 и 0.2) нельзя писать в двойчной системой счисления, будет бесконечно.

Самое близкое double от 0.1 - это

0.100000000000000005551115123126

Самое близкое double от 0.2 - это

0.200000000000000011102230246252

И вместе получится

0.300000000000000016653345369378

Самое близкое double от этого:

0.300000000000000044408920985006

Потом System.out.println покажет 0.30000000000000004.

Peter Olson
  • 10,462
2

У double существуют проблемы с точностью при арифметических операциях. Тут все подробно рассказано http://habrahabr.ru/post/112953/

0

Использовать BigDecimal вместо Double

подробно почитать можно здесь