Числа с плавающей точкой

Числа с плавающей точкой (или действительные числа) представлены типами float и double. Используются для хранения значений с точностью до определенного знака после десятичной точки.

double — это числа с двойной точностью, максимально приближённые к заданным или полученным в результате вычислений значениям. Используется в Java для любых математических вычислений (квадратный корень, синус, косинус,..).

float — менее точный тип с плавающей точкой. Используется очень редко с целью экономии памяти.

Пример объявления типов с плавающей точкой:

double d1 = 3.45;
float f1 = 34.456f;
Тип Размер в байтах Размер в битах Возможные значения (от..до) Значение по умолчанию
float 4 32 -3.4E+38..3.4E+38 (стандарт IEEE 754) 0.0
double 8 64 -1.7E+308..1.7E+308 (стандарт IEEE 754) 0.0

В языке Java есть три специальных числа плавающей точкой, которые используются для обозначения переполнения и ошибок:

  • положительная бесконечность - результат деления положительного числа на 0. Представлены константами Double.POSITIVE_INFINITY и Float.POSITIVE_INFINITY.
  • отрицательная бесконечность - результат деления отрицательного числа на 0. Представлены константами Double.NEGATIVE_INFINITY  и Float.NEGATIVE_INFINITY.
  • NaN (не число) - вычисление 0/0 или извлечение квадратного корня из отрицательного числа. Представлены константами Double.NaN и Float.NAN.

Пример использования специальных чисел с плавающей точкой в арифметических выражениях:

public class Main {
    public static void main(String[] args) {
        int a = 7;
        double b = 0.0;
        double c = -0.0;
        double g = Double.NEGATIVE_INFINITY;

        System.out.println(a / b);
        System.out.println(a / c);
        System.out.println(b == c);
        System.out.println(g * 0);
    }
}

Числа с плавающей точкой нельзя использовать в финансовых расчетах, где ошибки округления недопустимы. Например, в результате выполнения оператора System.out. println(2.0 - 1.1) будет выведено значение 0.8999999999999999, а не 0.9, как было бы логично предположить. Подобные ошибки связаны с внутренним двоичным представлением чисел. Как в десятичной системе счисления нельзя точно представить результат деления 1/3, так и в двоичной системе невозможно точно представить результат деления 1/10. Если же требуется исключить ошибки округления, то следует воспользоваться классом BigDecimal.

Read also:
Comments