왜 f가 float 값 뒤에 배치됩니까?


79

Java 또는 다른 언어에서 왜 f 또는 F가 float 값 뒤에 배치되는지 모르겠습니다. 예를 들어

float fVariable = 12.3f;

이것이 float 값임을 나타내는 것 외에 다른 기능이 있습니까?



그렇지 않으면 부동 소수점 값이 아니기 때문에 int 또는 double입니다.
user207421

@DeepakRaghuwanshi 자신의 블로그를 '이것에 대한 최고의 설명'이라고 설명하는 것은 조금 무례한 것 이상입니다. 실제로 쓰레기 더미라는 사실은 문제를 개선하지 않습니다.
user207421

답변:


67

기본적 12.3으로 double리터럴이므로 컴파일러에게 float명시 적으로 처리하도록 지시하려면 -> f또는F


2
마찬가지로 모든 전체 리터럴은 기본적으로 int입니다. 그래서 우리가 이런 식으로 리터럴을 할당하면 : long x = 2147483648; (이것은 2 ^ 31> int 범위이지만 컴파일러는 여전히 이것을 int 리터럴로 간주합니다. 따라서 L 또는 l을 추가하여 이것이 길다는 것을 컴파일러에게 알려야합니다) long x = 2147483648L;
Navdeep Singh

이 게시물에 늦을 수도 있지만 Java가 암시 적으로 부동으로 변환 할 수없는 이유는 무엇입니까? 우리는 유형이 float라고 말 했으므로 방금 그것이 무엇인지 말했을 때 왜 default-double로 취급할까요?
Stefan

52

프로그램에서 숫자를 표현하는 방법이 너무 많기 때문에 Java 설계자는 각 양식을 선택하여 가장 일반적인 사용 사례에 할당해야했습니다. 기본값으로 선택된 양식의 경우 정확한 유형을 나타내는 접미사 는 선택 사항입니다.

  • 정수 리터럴 (int, long)의 경우 기본값은 int 입니다. 명백한 이유로.
  • 부동 소수점 리터럴 (float, double)의 경우 기본값은 double 입니다. double을 사용 하면 저장된 값에 대해 더 안전한 산술이 가능하기 때문입니다.

그래서, 당신은 입력 할 때 12프로그램에서, 그게 전부 INT의 반대로 문자, 12L오래 . 그리고 당신은 입력 할 때 12.3하는 이잖아 이중 반대로 문자, 12.3F플로트 .

그렇다면 이것은 어디에 관련이 있습니까? 주로 다운 캐스트 처리 또는 전환 축소에 사용됩니다. long을 int로, double을 float로 다운 캐스트 할 때마다 데이터 손실 가능성이 존재합니다. 그래서 컴파일러는 것을 나타 내기 위해서 당신을 강제로 정말 이런 일에 대한 컴파일 에러 신호로의 축소 변환을 수행 할 :

float f = 12.3;

12.3은 double을 나타 내기 때문에 명시 적으로 float로 캐스트해야합니다 (기본적으로 축소 변환에서 사인 오프). 그렇지 않으면 올바른 접미사를 사용하여 숫자가 실제로 부동 소수점임을 나타낼 수 있습니다.

float f = 12.3f;

요약하자면 longfloat에 대한 접미사를 지정하는 것은 언어 설계자가 정확히 숫자를 지정해야하는 필요성과 하나의 스토리지 유형에서 다른 유형으로 숫자를 변환하는 유연성의 균형을 맞추기 위해 선택한 타협입니다.


1
경우에 있다는 지적이의 가치가 d최고입니다 double일부 수치 양의 표현 x, float f=(float)d가장 가까운 것 float의 조 당 부분 내에서의 어떤 값으로 x는 타입 변환을 필요로하더라도. 대조적으로, 경우는 f최고 float몇 가지 수치의 표현은 x, double d=f종종 갑자기 가까이 최선이 될 것입니다 경우에도 배역을 필요로하지 않습니다 double표현 x, 그리고으로 해제 될 수있다 크기 순서의 수백 . 나는 float f=(float)(1.0/10.0)캐스트 가 필요하지만 double d=1.0f/10.0f그렇지 않은 것이 아이러니하다고 생각 합니다 .
supercat

"따라서 컴파일러는 다음과 같은 컴파일 오류를 표시하여 축소 변환을 수행하기를 원함을 나타내도록 강제 할 것입니다."이것이 long 그래도 적용되어야 하는가
RetroCode

@Perception 왜 당신은 첫 번째 요점에서 분명한 이유로 글을 쓰십니까?
Rishabh Agrawal

28

float그리고 double일부 값을 근사 표현 값을 제공 할 수있다. 예 : 12.3 또는 0.1

차이점은 float가 정확하지 않다는 것입니다 (더 작기 때문에 정밀도가 낮기 때문).

System.out.println("0.1f == 0.1 is " + (0.1f == 0.1));
System.out.println("0.1f is actually " + new BigDecimal(0.1f));
System.out.println("0.1 is actually " + new BigDecimal(0.1));

인쇄물

0.1f == 0.1 is false
0.1f is actually 0.100000001490116119384765625
0.1 is actually 0.1000000000000000055511151231257827021181583404541015625

그래서 0.1에서 가장 가까운 표현이다 double0.1f의 가장 가까운 표현입니다float


큰! 그러나 어느 것이 실제 (수학적) 0.1이고 어느 것이 String.valueOf ( "0.1")와 같습니까?
Seshu Vinay 2014 년

4
BigDecimal 만 정확히 동일합니다. 나머지는 올바르게 사용하면 문자열로 변환 될 때 정답을 제공합니다.
Peter Lawrey 2014 년

6

float fVariable = 12.3; 괜찮습니다. 그러나 표현식에서 식별자없이 float 값만 사용하면 컴파일러에게 값이 float임을 알려야하므로 값 뒤에 접미사 "f"를 사용합니다. 예

플로트 fl = 13f / 5f;

여기서 13과 5는 부동 소수점 값입니다.


float fVariable = 12.3; 정확하지 않습니다. float 할당을 위해 항상 f 접두사를 추가해야합니다. 기본적으로 모든 실수는 두 배입니다.
Navdeep Singh 2018 년

2

컴파일하는 동안 모든 부동 소수점 숫자 (소수점이있는 숫자)는 기본적으로 double입니다.

따라서 숫자를 두 배로 늘리지 않고 float로만 원하는 경우 리터럴 상수 끝에 f 또는 F 를 추가하여 컴파일러에 명시 적으로 알려야합니다 .


2

Java에는 다양한 기본 변수 유형이 있으므로 일반화하기 위해 몇 가지 기본 기능이 있습니다. 입력 16.02를 주면 자동으로 이중 입력으로 간주됩니다. 따라서 그것을 float로 지정 하려면 숫자 뒤에 'f'를 언급 하거나 간단히 사용할 수 있습니다.

float f = (float) 16.02;

또는

float f = 16.02f;

같은 방식으로 숫자를 긴 유형으로 저장하려면 16 l 을 언급해야 합니다. 그렇지 않으면 자동으로 기본 유형, 즉 int 유형을 선택합니다.


1

Float는 단 정밀도 32 비트 IEEE 754 부동 소수점이고 Double은 배정 밀도 64 비트 IEEE 754 부동 소수점입니다. 소수점이있는 값을 사용할 때 0.23f (특히 float)로 지정하지 않으면 java는이를 double로 식별합니다.

10 진수 값의 경우 double 데이터 유형은 일반적으로 java에서 선택하는 기본 선택입니다. 이것을 확인하십시오


1

f를 사용하지 않으면 Java의 기본값 인 double로 해석됩니다. 다음과 같이 쓸 수도 있습니다. ##

float f=(float) 32.5956; float f=32.5956f;


당신을 stackoverflow에 두는 것이 좋습니다. 귀하의 대답은 괜찮지 만 다른 동료들이 이미 동일한 정보를 제공했습니다. 기여는 전에 언급되지 않았다면 정말 가치가 있습니다. 탑승을 환영합니다 ..
Hasnaa Ibraheem
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.