예:
float timeRemaining = 0.58f;
f이 번호 끝에이 (가 ) 필요한 이유는 무엇 입니까?
예:
float timeRemaining = 0.58f;
f이 번호 끝에이 (가 ) 필요한 이유는 무엇 입니까?
double & int .
답변:
float 선언은 두 부분으로 구성됩니다.
timeRemaining가 유형 임을 선언합니다 float.0.58이 변수에 값 을 할당합니다 .2 부에서 문제가 발생합니다.
오른쪽은 자체적으로 평가됩니다. C # 사양에 따르면 접미사가없는 소수점이 포함 된 숫자는 double.
이제 우리 double는 유형의 변수에 할당하려는 값이 float있습니다. 이를 위해,에서 암시 적 변환이 있어야 double로 float. 그러한 변환은 없습니다. 변환에서 정보를 잃을 수 있기 때문입니다 (이 경우에는 그렇게 할 수 있습니다).
그 이유는 컴파일러에서 사용하는 값이 실제로 0.58이 아니라 0.58에 가장 가까운 부동 소수점 값 (0.57999999999999978655962351581366 ...) double이고 정확히 0.579999946057796478271484375이기 때문입니다 float.
엄격히 말해서 f는 필수가 아닙니다. f값을 다음으로 캐스팅하여 접미사 를 사용하지 않아도됩니다 float.
float timeRemaining = (float)0.58;
(float) 0.58작동합니까? 이전에 정보가 손실 될 수 있기 때문에 변환이 없다고 말했는데, 캐스트가 어떻게 작동할까요?
2.4은 다른 모든 곳에서 이중으로 해석됩니다. 2. 암시 적 축소 변환 (예 : double에서 float로)은 허용되지 않습니다. 이러한 규칙에 예외를 적용하려면 아주 좋은 이유가 있어야합니다. 키 입력 1 개를 저장하는 것만으로는 충분하지 않을 수 있습니다.
컴파일러는 값을 표시하는 데 사용할 수있는 몇 가지 숫자 종류가 있습니다 때문에 0.58: float, double하고 decimal. 컴파일러가 당신을 위해 선택하는 것에 동의하지 않는 한, 명확하게해야합니다.
에 대한 문서 double는 유형을 직접 지정하지 않으면 컴파일러가 항상 double실제 숫자 리터럴의 유형으로 선택한다고 설명합니다 .
기본적으로 할당 연산자의 오른쪽에있는 실수 리터럴은 double로 처리됩니다. 그러나 정수를 double로 처리하려면 접미사 d 또는 D를 사용하십시오.
접미사 f를 추가하면 float; 접미사 d는 double; 접미사 m는 decimal. 이들 모두는 대문자로도 작동합니다.
그러나 이것이 컴파일되지 않는 이유를 설명하기에 여전히 충분하지 않습니다.
float timeRemaining = 0.58;
대답의 누락 절반의 전환이다 double 0.58받는 사람이 float timeRemaining컴파일러는 암시 적으로 적용하는 것을 거부 있도록 잠재적으로 정보가 손실 될 수 있습니다. 명시 적 캐스트를 추가하면 변환이 수행됩니다. f접미사를 추가하면 변환이 필요하지 않습니다. 두 경우 모두 코드가 컴파일됩니다.
int및 하나를 double.
double a = 0.69f;.
float합니다 double.
문제는 .NET이 순서대로 암시 적 작업의 일부 유형이 포함 수행 할 수 있도록한다는 것입니다 float및 double명시 적으로 혼합 피연산자를 포함하는 모든 시나리오에서 발생하거나 다른 유형 사이의 암시 적 변환이 일을 수행 할 수 있도록해야하는지 지정하는 데 필요한, 방향 만; 마이크로 소프트는 때때로 정확성을 선호하지만 종종 정확성을 희생하고 일반적으로 번거 로움을 야기하는 방향을 허용하기 위해 자바의 주도를 따르기로 결정했습니다.
거의 모든 경우에 double특정 숫자 수량에 가장 가까운 값을 가져와 a에 할당하면 동일한 수량에 가장 가까운 값 float이 생성됩니다 float. 9,007,199,791,611,905 값과 같은 몇 가지 코너 케이스가 있습니다. 최상의 float표현은 9,007,200,328,482,816 (536,870,911에서 벗어남)이지만 최상의 double표현 (예 : 9,007,199,791,611,904)을 캐스팅하여 9,007,199,254,740,992 ( 536,870,913에서 벗어남 )를 float산출합니다. 그러나 일반적 double으로 일부 수량 의 최상의 표현을 로 변환하면 최상의 표현이 float생성 float되거나 본질적으로 동일한 두 가지 표현 중 하나가 생성됩니다.
이 바람직한 동작은 극한 상황에서도 적용됩니다. 예를 들어, float수량 10 ^ 308에 float대한 최상의 double표현은 해당 수량 의 최상의 표현을 변환하여 얻은 표현 과 일치합니다 . 마찬가지로, float10 ^ 309 float의 최상의 double표현은 해당 수량 의 최상의 표현을 변환하여 얻은 표현 과 일치합니다 .
불행히도, 명시적인 캐스트가 필요하지 않은 방향으로의 변환은 거의 정확하지 않습니다. 최고의 변환 float에 값의 표현을 double거의 특히 가까운 최고의 아무것도 얻을 수 없습니다 double예를 들어, 최고의 변환 (그 값의 표현, 경우에 결과는 크기 순서의 수백에 의해 해제 될 수있다 float10 ^ 40의 표현을 double뜻 수율 double10 ^ 300 의 최상의 표현 보다 큰 값을 비교합니다 .
아아, 변환 규칙은 그 자체이므로 "안전한"방향으로 값을 변환 할 때 어리석은 유형 변환 및 접미사를 사용하여 살아야하며, 종종 가짜 결과를 생성하는 위험한 방향의 암시 적 유형 변환에주의해야합니다.
double.