답변:
두 피연산자 (1 및 3)는 정수이므로 정수 산술 (여기서 나누기)이 사용됩니다. 결과 변수를 double로 선언하면 나눗셈 후에 암시 적 변환이 발생합니다 .
물론 정수 나눗셈은 0으로 반올림 된 나눗셈의 실제 결과를 반환합니다. 따라서의 결과는 0.333...
여기서 0으로 내림됩니다. (프로세서는 실제로 반올림을 수행하지 않지만 여전히 그렇게 생각할 수 있습니다.)
또한 두 피연산자 (숫자)가 모두 실수로 제공 되는 경우에도 유의하십시오 . 3.0 및 1.0 또는 첫 번째 , 부동 소수점 산술이 사용되어 0.333...
.
당신은 사용해야합니다
double g=1.0/3;
또는
double g=1/3.0;
정수 나누기는 정수를 반환합니다.
1과 3을 정수로 처리하므로 결과를 0으로 반올림하여 정수가됩니다.
원하는 결과를 얻으려면 숫자가 다음과 같이 두 배라는 것을 명시 적으로 Java에 알려주십시오.
double g = 1.0/3.0;
JAVA에서의 변환은 매우 간단하지만 약간의 이해가 필요합니다. 정수 연산 에 대한 JLS에 설명 된대로 :
시프트 연산자가 아닌 정수 연산자에 long 유형의 피연산자가 하나 이상 있으면 64 비트 정밀도를 사용하여 연산이 수행되고 숫자 연산자의 결과는 long 유형입니다. 다른 피연산자가 길지 않으면 먼저 숫자 승격 (§5.6)에 의해 long을 입력하도록 확장됩니다 (§5.1.5).
그리고 예제는 항상 JLS를 번역하는 가장 좋은 방법입니다.)
int + long -> long
int(1) + long(2) + int(3) -> long(1+2) + long(3)
그렇지 않으면 32 비트 정밀도를 사용하여 연산이 수행되고 숫자 연산자의 결과는 int 유형입니다. 피연산자가 int가 아니면 먼저 숫자 승격을 통해 int를 입력하도록 확장됩니다.
short + int -> int + int -> int
Eclipse를 사용하여 두 개의를 추가하는 것조차 short
쉽지 않다는 것을 보여주는 작은 예제 :
short s = 1;
s = s + s; <- Compiling error
//possible loss of precision
// required: short
// found: int
이를 위해서는 정밀도가 떨어질 수있는 주조가 필요합니다.
부동 소수점 연산자도 마찬가지입니다.
숫자 연산자에 대한 피연산자 중 하나 이상이 double 유형이면 64 비트 부동 소수점 산술을 사용하여 연산이 수행되고 숫자 연산자의 결과는 double 유형 값입니다. 다른 피연산자가 double이 아닌 경우 먼저 숫자 승격 (§5.6)에 의해 double을 입력하도록 확장됩니다 (§5.1.5).
따라서 프로모션은 플로트에서 두 배로 이루어집니다.
그리고 정수와 부동 값을 혼합하면 위에서 말한 것처럼 부동 값이 생성됩니다.
이항 연산자에 대한 피연산자 중 하나 이상이 부동 소수점 유형이면 다른 하나가 정수인 경우에도 연산은 부동 소수점 연산입니다.
이항 연산자에는 해당되지만 "할당 연산자"에는 해당되지 않습니다. +=
간단한 작업 예제만으로도이를 증명할 수 있습니다.
int i = 1;
i += 1.5f;
그 이유는 여기에 암시 적 캐스트가 있기 때문입니다. 이것은 다음과 같이 실행됩니다.
i = (int) i + 1.5f
i = (int) 2.5f
i = 2
나는 이걸했다.
double g = 1.0/3.0;
System.out.printf("%gf", g);
이중 계산을 수행하는 동안 .0을 사용하십시오. 그렇지 않으면 Java에서 정수를 사용한다고 가정합니다. 계산에서 임의의 양의 double 값을 사용하는 경우 출력은 double 값이됩니다. 이 모두 정수이면 출력은 정수가됩니다.
이것을 시도하십시오 :
public static void main(String[] args) {
double a = 1.0;
double b = 3.0;
double g = a / b;
System.out.printf(""+ g);
}
"double g = 1.0 / 3.0;" 대신.
다른 많은 사람들이 실제 문제를 지적하지 못했습니다.
정수에 대한 연산은 연산 결과를 정수로 캐스트합니다.
이것은 반드시 정수로 표시 될 수 있는 부동 소수점 결과 가 잘릴 것임을 의미합니다 (소수점 부분을 잘라 냄).
캐스트 (타입 캐스팅 / 타입 변환) 란 무엇인가요 ?
언어 구현에 따라 다르지만 Wikipedia는 상당히 포괄적 인 관점을 가지고 있으며 질문에 답하는 데 중요한 정보 인 강제 에 대해서도 이야기 합니다.
1/2
대상 언어 (java)가 아닌와 같은 모든 정수 분할에는 유형 변환 또는 유형 변환이 없습니다 . 정수 나누기를 호출하면 정수 결과가 생성됩니다. 유형 캐스팅 때문 만에서 최대 변환이며 int
A와 double
할당시.
0.5
. 간단히 말해서 Java에서는 1/2
정수 나눗셈으로 0의 정수가됩니다. double에 0을 할당 할 수 있지만 0.0
double 이지만 여전히 0 입니다.
int i = .99999999
int를 0으로 설정합니다.보다 구체적으로 정수 부분을 취하고 나머지는 버립니다.