분수 손실 가능성


119

이것이 순진한 질문이라면 저를 용서하십시오. 그러나 나는 오늘 당황합니다.

다음과 같은 간단한 나눗셈 계산이 있습니다.

double returnValue = (myObject.Value / 10);

값은 개체의 정수입니다.

가능한 분수 손실 가능성이라는 메시지를 받았습니다. 그러나 double을 int로 변경하면 메시지가 사라집니다.

왜 이런 일이 일어날 지에 대한 생각이 있습니까?


훌륭한 답변에 감사드립니다. 이제 2 개의 int 값을 나눌 때 소수점을 잃는 것이 이치에 맞습니다.
CodeLikeBeaker

답변:


168

두 개의 int를 부동 소수점 값으로 나누면 분수 부분이 손실됩니다. 항목 중 하나를 부동으로 캐스팅하면이 오류가 발생하지 않습니다.

예를 들어 10을 10.0으로 바꿉니다.

double returnValue = (myObject.Value / 10.0);

57

myObject.Value양쪽 /이 정수 유형 이기 때문에 int 인 경우 정수 나누기를 수행 합니다.

부동 소수점 나누기를 수행하려면 표현식의 숫자 중 하나가 부동 소수점 유형이어야합니다. myObject.Value가 double이거나 다음 중 하나 인 경우 해당됩니다.

double returnValue = myObject.Value / 10.0;
double returnValue = myObject.Value / 10d; //"d" is the double suffix
double returnValue = (double)myObject.Value / 10;
double returnValue = myObject.Value / (double)10;

7

정수로 나눈 정수는 정수를 반환합니다. Value를 double로 캐스트하거나 10.0으로 나눕니다.


7

그 가정 myObject.Valueint, 방정식은 myObject.Value / 10다음 번에 전송할 것이다 정수 분할 될 것이다.

MyObject.Value에 12 되에 ReturnValue는 1이되고 초래할 것이라는 것을 의미 하지 1.2.

먼저 값을 캐스팅해야합니다.

double returnValue = (double)(myObject.Value) / 10.0;

이것은 올바른 값 1.2를 초래할 것입니다. 적어도 두 배가 그들의 한계를 감안할 때 허용하는만큼 정확하지만 그것은 거의 끝없이 SO의 다른 곳에서 논의됩니다 :-).


4

myObject가 int이므로

double returnValue=(myObject.Value/10.0); 
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.