Понимание Кастинга в Java - PullRequest
4 голосов
/ 04 июля 2011

Это мой первый пост здесь, и я хотел бы поблагодарить всех людей, которые могут помочь мне с этим простым вопросом: как работает кастинг в Java?

Я сделал этот очень простой класс:

public class test {
    public static void main ( String[] args )
    {
        System.out.println((short)(1/3));
        System.out.println((int)(1/3));
        System.out.println((float)(1/3));
        System.out.println((double)(1/3));
    }
}

и эта часть программного обеспечения выдает мне этот вывод при выполнении (официальный JDK 6 u26 на 32-битной машине под Linux)

0
0
0.0
0.0

проблема, или вещь, которую я не понимаюесли хотите, то, что последние 2 результата - 0.0, я ожидал что-то вроде 0.3333333, но, очевидно, актерский состав работает по-другому: как?

спасибо

PS Я не такойзнакомы с английским языком, если я сделал несколько ошибок, я прошу прощения за это

Ответы [ 6 ]

9 голосов
/ 04 июля 2011

Сначала выполняется выражение 1/3.Это выражение означает «целочисленное деление 1 на 3».И его результатом является целое число 0.Затем этот результат (0) приводится к удвоению (или с плавающей точкой).И, конечно, это приводит к 0.0.

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

double d = ((double) 1) / 3;

или просто напишите

1.0 / 3
5 голосов
/ 04 июля 2011

Если вы используете оператор / для целочисленных значений, результат будет напечатан как целое число.

Вы должны будете принудительно ввести 1 или 3 в значение с плавающей запятой - попробуйте написать 1.0/3 вместо 1/3.

4 голосов
/ 04 июля 2011

В последних 2 случаях вы сначала вычисляете 1/3, что равно 0. Затем вы приводите его к числу с плавающей точкой / двойному.Использование:

((float)1)/3
1 голос
/ 04 июля 2011

Поскольку у вас есть 1/3 в скобках, он использует целочисленное деление, а затем приводит к указанному типу. Если бы вы использовали 1.0 / 3.0 или (float) 1/3, было бы оценено значение .3333333. 1 и 3 - целочисленные литералы, поэтому результаты деления будут усечены. Чтобы использовать плавающие и двойные литералы, поставьте f или d в конце числа (1.0f, 1.0d). Приведение влияет на значение после него, поэтому, если ваше значение указано в скобках, оно оценит его, а затем выполнит приведение.

1 голос
/ 04 июля 2011

Вам нужно разыграть операнды, а не результат. Это даст ожидаемый результат:

System.out.println(((short) 1 / (short) 3));
System.out.println((1 / 3));
System.out.println(((float) 1 / (float) 3));
System.out.println(((double) 1 / (double) 3));
1 голос
/ 04 июля 2011

int преобразуется в double.

(1/3) имеет тип int, поэтому ответ будет 0.

Теперь 0 преобразуется в удвоенный или плавающий, поэтому он становится 0.0

...