7.1 Тип double

Для работы с вещественными (дробными) числами в Java используется тип double. В памяти он занимает 8 байт (в два раза больше, чем тип int) и может хранить значения в диапазоне -1.7*10308 до +1.7*10308. Для сравнения: тип int может хранить значение в диапазоне -2*109 до +2*109.

В вещественных числах дробная часть записывается после точки. Например, 123.456, или 2.5, или 100.00 или 0.01. Такие числа еще называют числами с плавающей точкой — floating point number – компьютерное название для вещественных чисел.

Кстати, кроме типа double есть еще вещественный тип float (размером всего 4 байта). Его название как раз и происходит от floating point. Название же double происходит от double float. Тип double в два раза больше, чем float: 8 байт против 4. Его еще называют вещественное число двойной точности.


7.2 Создание переменной типа double

Тип double используется для хранения вещественных чисел. Чтобы создать в коде переменную, которая будет способна хранить вещественные числа, нужно воспользоваться командой:

double имя;
Создание переменной типа double

Где имя — это имя переменной. Примеры:

Команда Описание
double price;
Создается вещественная переменная price
double weight;
Создается вещественная переменная weight
double lightSpeed;
Создается вещественная переменная lightSpeed

Так же, как и с типом int, можно использовать краткую запись для создания нескольких переменных типа double:

double имя1, имя2, имя3;
Создание нескольких переменных типа double

И даже сразу присваивать им значения:

double имя1 = значение1, имя2 = значение2, имя3 = значение3;
Создание и инициализация нескольких переменных типа double

Примеры:

Команда Примечание
double price = 5.0;
В переменной хранится значение 5.0
double weight = 2;
В переменной хранится значение 2.0
double x = 1.0, y = 2.0, z = 3.0;

7.3 Присваивание целых и вещественных чисел

Было бы плохо, если бы целые числа можно было присваивать только переменным типа int, а вещественные — только переменным типа double. Хотелось бы иметь возможность преобразовывать одни числа в другие. И в Java такая возможность есть.

Во-первых, переменным типа double можно присваивать как вещественные, так и целые числа. При присваивании целых чисел они просто преобразовываются в вещественные. Хотя иногда при этом возможна небольшая потеря точности.

Команда Примечание
double price = 5.0;
В переменной хранится значение 5.0
double weight = 2;
В переменной хранится значение 2.0
int t = 1000;
double x =  t * t;
В переменной x хранится значение 1000000.0

Во-вторых, если в каком-то выражении участвуют целое и вещественное число, целое сначала преобразуется в вещественное и только потом взаимодействует с другим вещественным числом.

Команда Примечание
int t = 1000;
double x = t * 5.0;
В переменной x хранится значение 5000.0
System.out.println(5 * 2);
На экран будет выведено число 10
System.out.println(5 * 2.0);
На экран будет выведено число 10.0

И наконец, есть возможность присваивать переменным типа int вещественные числа. Дробная часть числа при этом отбрасывается — число округляется вниз до целого.

Также компилятор требует, чтобы этот факт программист задокументировал явно (чтобы другие программисты понимали, что тут происходит отбрасывание дробной части). Общий вид этого выражения в коде такой:

целочисленная_переменная = (int)(вещественное_число);
Присваивание переменной типа int вещественного числа

Примеры:

Команда Примечание
int x = (int)(5.5);
В переменной x хранится значение 5
double a = 5.999;
int x = (int)(a);
В переменной x хранится значение 5
double a = 5.999;
int b = 2;
int x = (int)(a * b);
В переменной x хранится значение 11

7.4 Деление целых и вещественных чисел в Java

При делении целого числа на целое остаток всегда отбрасывается. Как же тогда, скажем, поделить 5 на 2, чтобы получить 2.5?

Поначалу кажется, что правильный вариант такой:

double d = 5 / 2;

Однако не все так просто. Дело в том, что Java-машина сначала вычислит значение выражения 5 / 2 и только потом присвоит результат в переменную d. А деление 5 / 2 выполнится нацело. Т.е. d будет содержать 2 или, если быть более точным, 2.0

Правильный вариант такой: хотя бы одно из чисел, участвующих в делении, нужно записать как вещественное (т.е. с точкой):

double d = 5.0 / 2;
double d = 5 / 2.0;
double d = 5.0 / 2.0;

В любом из этих выражений d будет содержать значение 2.5

А как же быть с переменными? Что если у нас есть такой код:

int a = 5;
int b = 2;
double d = a / b;

Тут есть хитрое (и очевидное) решение — заставить Java-машину преобразовать переменные в вещественные, умножив их на вещественную единицу — 1.0

int a = 5;
int b = 2;
double d = a * 1.0 / b;

Обратите внимание, что у операций умножения и деления равный приоритет, и они выполняются слева направо, поэтому имеет значение, где именно мы умножаем на вещественную единицу.

Примеры:

Команда Порядок выполнения Результат
int a = 5;
int b = 2;
double d = 1.0 * a / b;
(1.0 * a) / b; 2.5
int a = 5;
int b = 2;
double d = a * 1.0 / b;
(a * 1.0) / b; 2.5
int a = 5;
int b = 2;
double d = a / b * 1.0;
(a / b) * 1.0; 2.0