왜 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;

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


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에서 가장 가까운 표현이다 double과 0.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.