You are here: Home » Учебник » Преобразование числовых типов

Преобразование числовых типов

Ключевой момент: числа с плавающей точкой могут быть преобразованы в целые числа посредством явного преобразования (кастинга).

Можете ли вы выполнять двоичные операции с двумя операндами разных типов? Да. Если целое число и число с плавающей запятой задействованы в двоичной операции, 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 с двумя цифрами после десятичной запятой.

Проверь себя:

  1. Могут ли различные типы числовых значений использоваться вместе в расчётах?
  2. Что делает с дробной частью значения double явное преобразование типа из double в int? Меняет ли преобразование типа значение переменной, которая подвергается кастингу?
  3. Покажите следующий вывод:
float f = 12.5F;
int i = (int)f;
System.out.println("f это " + f);
System.out.println("i это " + i);
  1. Если в программе из этого раздела в строке 11 вы поменяете (int)(tax * 100) / 100.0 на (int)(tax * 100) / 100, какой будет вывод при размере покупки 197.55?
  2. Покажите вывод следующего кода:
double amount = 5;
System.out.println(amount / 2);
System.out.println(5 / 2);

2 комментария

  1.         System.out.println("Налог с продаж равен $" + (int) (tax * 100) / 100.0);

    Добрый день. У меня выдает ошибку преобразования при вводе 197.55. Нужна запятая, а не точка.

    Нашел это только опытным путем. Почему именно в этом случае имеет значение? Для int и double

    нужны разные делители?

     

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *

wp-puzzle.com logo