Ключевой момент: числа с плавающей точкой могут быть преобразованы в целые числа посредством явного преобразования (кастинга).
Можете ли вы выполнять двоичные операции с двумя операндами разных типов? Да. Если целое число и число с плавающей запятой задействованы в двоичной операции, Java автоматически преобразует целое число в значение с плавающей запятой. Итак, 3 * 4,5 это то же самое что и 3.0 * 4.5.
Кастинг, расширение типа, сужение типа
Вы всегда можете присвоить значение числовой переменной, тип которой поддерживает больший диапазон значений; таким образом, например, вы можете назначить значение long переменной float. Однако вы не можете назначить значение переменной типа с меньшим диапазоном, если вы не используете преобразование типов. Явное преобразование (кастинг) – это операция, которая преобразует значение одного типа данных в значение другого типа данных. Преобразование типа с меньшим диапазоном в тип с большим диапазоном известно как расширение типа. Преобразование типа с большим диапазоном в тип с меньшим диапазоном известно как сужение типа. Java автоматически расширит тип, но вы сужать тип вы должны явным образом.
Синтаксис преобразования типа – указание целевого (нового) типа в круглых скобка, за которыми следует имя переменной или значение для преобразования. Например, следующая инструкция
System.out.println((int)1.7);
покажет 1. Когда преобразовывается значение double в значение int, дробная часть отсекается.
Следующее выражение
System.out.println((double)1 / 2);
покажет 0.5, поскольку в начале 1 преобразовано в 1.0, затем 1.0 поделено на 2. Тем не менее, выражение
System.out.println(1 / 2);
покажет 0, поскольку 1 и 2 оба являются целыми числами и результатом должно быть также целое число.
Внимание: явное преобразование типа необходимо если вы присваиваете значение переменной с меньшим типом диапазона, например, значение double переменной int. Если явное преобразование не используется, то в ситуации подобного рода случиться ошибка компиляции. Тем не менее, будьте осторожны при использовании явного преобразования, поскольку потеря информации может привести к неточным результатам.
Помните: явное преобразование типа не меняет значение переменной, которая подвергается кастингу. Например, в следующем коде d не меняется после преобразования типа:
double d = 4.5; int i = (int)d; // i становится 4, но d по прежнему 4.5
Справка: в Java расширенное выражение в форме x1 op= x2 реализовано как x1 = (T)(x1 op x2), где op – это один из операторов (+, —, *, /, %), T это тип для x1. Поэтому следующий код является корректным.
int sum = 0; sum += 4.5; // sum становится 4 после этого присваивания
sum += 4.5 это эквивалент для sum = (int)(sum + 4.5).
Помните: для присвоения переменной типа int переменной типа short или byte должно использоваться явное преобразование типов. Например, следующие инструкции имеют ошибку компиляции:
int i = 1; byte b = i; // Ошибка, поскольку необходимо явное преобразование типа
Однако, пока целочисленный литерал находится в пределах допустимого диапазона целевой переменной, явное преобразование не требуется для назначения целочисленного литерала переменной типов short или byte (смотрите раздел Числовые литералы).
Следующая программа отображает налог с продаж с двумя цифрами после десятичной запятой:
import java.util.Scanner; public class SalesTax { public static void main(String[] args) { Scanner input = new Scanner(System.in); System.out.print("Введите сумму покупки: "); double purchaseAmount = input.nextDouble(); double tax = purchaseAmount * 0.06; System.out.println("Налог с продаж равен $" + (int) (tax * 100) / 100.0); } }
Переменная purchaseAmount равна 197.55 (строка 8). Налог с продаж равен 6% от покупки, поэтому tax вычисляется как 11.853 (строка 10). Обратите внимание, что
tax * 100 равно 1185.3
(int)(tax * 100) равно 1185
(int)(tax * 100) / 100.0 равно 11.85
Т.е. инструкция на строке 11 отображает налог 11.85 с двумя цифрами после десятичной запятой.
Проверь себя:
- Могут ли различные типы числовых значений использоваться вместе в расчётах?
- Что делает с дробной частью значения double явное преобразование типа из double в int? Меняет ли преобразование типа значение переменной, которая подвергается кастингу?
- Покажите следующий вывод:
float f = 12.5F; int i = (int)f; System.out.println("f это " + f); System.out.println("i это " + i);
- Если в программе из этого раздела в строке 11 вы поменяете (int)(tax * 100) / 100.0 на (int)(tax * 100) / 100, какой будет вывод при размере покупки 197.55?
- Покажите вывод следующего кода:
double amount = 5; System.out.println(amount / 2); System.out.println(5 / 2);
System.out.println(
"Налог с продаж равен $"
+ (
int
) (tax *
100
) /
100.0
);
Добрый день. У меня выдает ошибку преобразования при вводе 197.55. Нужна запятая, а не точка.
Нашел это только опытным путем. Почему именно в этом случае имеет значение? Для int и double
нужны разные делители?
Надо было по порядку читать, без пропусков. Здесь об этом: https://java9.ru/?p=152#InputMismatchException