float를 선언 할 때 "f"가 필요한 이유는 무엇입니까?


86

예:

float timeRemaining = 0.58f;

f이 번호 끝에이 (가 ) 필요한 이유는 무엇 입니까?


4
그렇지 않으면 double.
우베 KEIM

2
0.58 (f 접미사 없음)은 double 유형의 리터럴이며 문자열에 int 값을 할당 할 수없는 것처럼 float에 double 값을 할당 할 수 없습니다. 그러나 여기에서 넓히기 때문에 float 값을 double에 할당 할 수 있습니다 (정밀도가 손실되지 않으므로 C #이 암시 적으로이를 변환합니다).
Dave New


@AVD 이것은 중복이지만 위의 질문 제목은 가능한 중복 목록에 링크를 생성하지 않습니다. 따라서 이것은 적어도 더 많은 검색 기준 측면에서 가치를 추가 할 수 있습니다.
아담 Houldsworth

1
@AdamHouldsworth-모든 길은 double & int .
adatapost

답변:


96

float 선언은 두 부분으로 구성됩니다.

  1. 변수 timeRemaining가 유형 임을 선언합니다 float.
  2. 0.58이 변수에 값 을 할당합니다 .

2 부에서 문제가 발생합니다.

오른쪽은 자체적으로 평가됩니다. C # 사양에 따르면 접미사가없는 소수점이 포함 된 숫자는 double.

이제 우리 double는 유형의 변수에 할당하려는 값이 float있습니다. 이를 위해,에서 암시 적 변환이 있어야 doublefloat. 그러한 변환은 없습니다. 변환에서 정보를 잃을 수 있기 때문입니다 (이 경우에는 그렇게 할 수 있습니다).

그 이유는 컴파일러에서 사용하는 값이 실제로 0.58이 아니라 0.58에 가장 가까운 부동 소수점 값 (0.57999999999999978655962351581366 ...) double이고 정확히 0.579999946057796478271484375이기 때문입니다 float.

엄격히 말해서 f는 필수가 아닙니다. f값을 다음으로 캐스팅하여 접미사 를 사용하지 않아도됩니다 float.

float timeRemaining = (float)0.58;

4
두 가지 질문, '0.579999946057796478271484375'에 어떻게 도착했으며 어떻게 (float) 0.58작동합니까? 이전에 정보가 손실 될 수 있기 때문에 변환이 없다고 말했는데, 캐스트가 어떻게 작동할까요?
SexyBeast 2014 년

8
1. 최대 34 자리 숫자를 사용하는 Windows 계산기를 사용했습니다. 2. 암시 적 변환 이 없다고 말했습니다 . 캐스트는 명시 적 변환이므로 컴파일러에게 변환을 원한다는 것을 명시 적으로 알리는 것이 허용됩니다.
Jeffrey Sax

흥미 롭군요 ...이 게시물을 계속 모니터링하고 계시길 바랍니다. 내가보고있는 웹 캐스트에서 이전에 'm'으로 접미사를 접한 적이 있습니다. Windows 계산기에서 부동 값으로 .58을 표시하는 방법은 무엇입니까? 나는 그들이 이것을 강제하는 것처럼 보이는 몇 개의 버튼을 시도했지만 0.58을 계속 얻었습니다. 나는 너무 잘 자신의 도구를 아는 사람 ... 존중해야
user1585204

나는 플로트에 대한 전체 F를 이해하지만 왜? 선언 할 때 변수는 float로 선언되므로 컴파일 할 때이 값이 float임을 알아야합니다. 그리고 당신이 이중 같은 것을 선언 할 때. float myvalue = 2.4이기 때문에 이치에 맞지 않습니다. 이제 컴파일 할 때 컴파일러는 float가 변수 유형임을 이미 알고 있어야합니다. 내가 뭔가를 놓치고 있습니까? 감사!
Frank G.

@FrankG. 두 가지 이유 : 1.이 표현 2.4은 다른 모든 곳에서 이중으로 해석됩니다. 2. 암시 적 축소 변환 (예 : double에서 float로)은 허용되지 않습니다. 이러한 규칙에 예외를 적용하려면 아주 좋은 이유가 있어야합니다. 키 입력 1 개를 저장하는 것만으로는 충분하지 않을 수 있습니다.
Jeffrey Sax

36

컴파일러는 값을 표시하는 데 사용할 수있는 몇 가지 숫자 종류가 있습니다 때문에 0.58: float, double하고 decimal. 컴파일러가 당신을 위해 선택하는 것에 동의하지 않는 한, 명확하게해야합니다.

에 대한 문서 double는 유형을 직접 지정하지 않으면 컴파일러가 항상 double실제 숫자 리터럴의 유형으로 선택한다고 설명합니다 .

기본적으로 할당 연산자의 오른쪽에있는 실수 리터럴은 double로 처리됩니다. 그러나 정수를 double로 처리하려면 접미사 d 또는 D를 사용하십시오.

접미사 f를 추가하면 float; 접미사 ddouble; 접미사 mdecimal. 이들 모두는 대문자로도 작동합니다.

그러나 이것이 컴파일되지 않는 이유를 설명하기에 여전히 충분하지 않습니다.

float timeRemaining = 0.58;

대답의 누락 절반의 전환이다 double 0.58받는 사람이 float timeRemaining컴파일러는 암시 적으로 적용하는 것을 거부 있도록 잠재적으로 정보가 손실 될 수 있습니다. 명시 적 캐스트를 추가하면 변환이 수행됩니다. f접미사를 추가하면 변환이 필요하지 않습니다. 두 경우 모두 코드가 컴파일됩니다.


하지만 변수가 float 인 경우 어떻게 이중 또는 소수가 될 수 있습니까? 나는 뭔가를 놓치고 있습니다
Thomas

@BlazArt 예, 컴파일러가 할당 대상을 확인하려고 시도하지 않는다는 문장입니다. 그 이유는 컴파일러 팀의 디자인 선택에 묻힐 것입니다. 나는 그것이 혼동의 얼굴에 명시하는 것이 가장 좋습니다 추측 것, 또는 구현하는 대신 두 규칙 하나 가지고 귀찮게 너무 비싸 int및 하나를 double.
아담 Houldsworth

@BlazArt : 방금 답변을 구체화했습니다. 다시 한 번 살펴보세요.
Jon

1
정보 손실과 관련하여 저장된 IEEE 754 형식과 관련하여 캐스트가 실제로 어떻게 수행되는지 알려 주실 수 있습니까? Double은 정밀도가 더 높으므로 float에서 double로 캐스트가 항상 작동한다는 의미입니다 double a = 0.69f;.
SexyBeast 2014 년

@Cupidvogel : 예, 사양은 §6.1.2에서 "다른 암시 적 숫자 변환은 정보를 잃지 않음"을 보장 float합니다 double.
Jon

2

문제는 .NET이 순서대로 암시 적 작업의 일부 유형이 포함 수행 할 수 있도록한다는 것입니다 floatdouble명시 적으로 혼합 피연산자를 포함하는 모든 시나리오에서 발생하거나 다른 유형 사이의 암시 적 변환이 일을 수행 할 수 있도록해야하는지 지정하는 데 필요한, 방향 만; 마이크로 소프트는 때때로 정확성을 선호하지만 종종 정확성을 희생하고 일반적으로 번거 로움을 야기하는 방향을 허용하기 위해 자바의 주도를 따르기로 결정했습니다.

거의 모든 경우에 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 의 최상의 표현 보다 큰 값을 비교합니다 .

아아, 변환 규칙은 그 자체이므로 "안전한"방향으로 값을 변환 할 때 어리석은 유형 변환 및 접미사를 사용하여 살아야하며, 종종 가짜 결과를 생성하는 위험한 방향의 암시 적 유형 변환에주의해야합니다.

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