2014-12-22 2 views
159

float 데이터 유형은 단 정밀도 32 비트 IEEE 754 부동 소수점이며 double 데이터 유형은 배정 밀도 64 비트 IEEE 754 부동 소수점입니다.Java에서의 float 및 double 데이터 유형

어떤 의미입니까? 그리고 언제 double을 대신 float을 사용해야합니까?

+4

당신은 두 번 대신 수레를 사용해야합니다. 보다 정확한 계산이 필요한 경우 double을 사용하십시오. – Everv0id

+8

@ Everv0id : 메모리가 너무 빡빡해서 공간의 정확도를 희생해야만하는 상황에 대해서는 확신 할 수 없습니다. (선의를 위해 * Java *를 사용하고 있습니다 ...) 그것이 요구 될 때 상황이있을 수 있지만 제 연습에서는 아주 드물게 보았습니다. 왜 이것이 좋은 생각이라고 생각 하는지를 자세히 설명하고 싶다면 for-instance로 답을하면 가치있는 추가가 될 것입니다. – Makoto

+0

http : //en.wikipedia.org/wiki/IEEE_floating_point –

답변

189

Wikipedia page은 시작하기 좋은 곳입니다.

정리해 :

  • float은, 1 부호 비트와, 32 비트에서 8 비트의 지수 및 유효수 23 비트 표현 (또는 어떤 과학적 표기법 번호는 다음된다 2.33728을 * 10 ; 33728은 유효 숫자입니다.

  • double은 64 비트, 1 부호 비트, 지수 11 비트 및 유효 숫자 52 비트로 표현된다. 기본적으로

는, 자바는 부동 소수점 숫자 (그래서 문자 3.14double 입력 된)을 표현하기 위해 double를 사용합니다. 또한 더 큰 숫자 범위를 제공하는 데이터 유형이기 때문에 float 이상의 사용을 강력히 권장합니다.

특정 실제로 float의 사용량을 강제 도서관, 그러나 일반적으로있을 수 있습니다 - 당신은 당신의 결과가 floatprescribed range가, 다음은 double으로 선택하는 것이 최선의 방법에 들어갈 정도로 작은 것이라고 보장 할 수 없다면. 당신은 정확성이 필요한 경우

은 - 다음, 예를 들어, 당신은 부정확 진수 값 (같은 1/10 + 2/10)를 가질 수 없습니다, 또는 당신이 (시스템에 $ 10.33를 대표하는, 예를 들어) 통화를 아무것도을하고있는 BigDecimal을 사용하면 임의의 양의 정밀도를 지원하고 그와 같은 상황을 우아하게 처리 할 수 ​​있습니다.

+2

주어진 예제에서 233728 == 가수가 아닌가요? 내 말은, 정수 부분은 어디에 저장되어 있는가? – JaLoveAst1k

+0

알고 싶습니다. 233728이 가수 여야합니다. – joshreesjones

+1

@ mathguy54 : 과학 표기법에서 2는 정수이고 .33728은 가수입니다. [여기에 대한 참고 사항입니다.] (https://en.wikipedia.org/wiki/Significand) – Makoto

57

부표는 약입니다. 6-7 십진수는 정밀도를 나타냅니다. 15-16. 또한 숫자의 범위는 double의 경우 더 큽니다.

double에는 8 바이트의 저장 공간이 필요하고 float에는 4 바이트 만 있으면됩니다.

10

실수로 알려진 부동 소수점 숫자는 분수 정밀도가 필요한 표현식을 평가할 때 사용됩니다. 예를 들어 제곱근 또는 사인 및 코사인과 같은 초월점과 같은 계산 결과는 부동 소수점 유형이 필요한 정밀도 값이됩니다. Java는 부동 소수점 유형 및 연산자의 표준 (IEEE-754) 세트를 구현합니다. float 및 double의 두 종류가 있으며 각각 단 정밀도 및 배정 밀도 숫자를 나타냅니다. 이들의 폭과 범위는 여기에 나타낸 바와 같다 : float 형 스토리지의 32 비트를 사용하여 단 정밀도 값을 지정


Name  Width in Bits Range 
    double 64    1 .7e–308 to 1.7e+308 
    float 32    3 .4e–038 to 3.4e+038 


로트.단 정밀도는 일부 프로세서에서 더 빠르며 배정도만큼 공간의 절반을 차지하지만 값이 매우 크거나 작을 때 부정확 해집니다. float 유형의 변수는 분수 구성 요소가 필요할 때 유용하지만 큰 정밀도가 필요하지는 않습니다. 예를 들어, float은 달러와 센트를 나타낼 때 유용 할 수 있습니다. 여기

일부 예에서는 변수 선언 떠있다 :

플로트 hightemp, lowtemp 단계; 이중 키워드로 나타낸 바와 같이


이중

더블 정밀도는, 값을 저장하기 위해 64 비트를 사용한다. 이중 정밀도는 고속 수학 계산에 맞게 최적화 된 일부 최신 프로세서에서는 단 정밀도보다 실제로 빠릅니다. sin(), cos() 및 sqrt()와 같은 모든 초월 수학 함수는 double 값을 반환합니다. 많은 반복 계산에 대해 정확성을 유지해야하거나 큰 값을 조작하는 경우에는 이중을 선택하는 것이 가장 좋습니다.

+0

나는이 질문에 대한 답변을 확신하지 못했습니다 ... – Makoto

+0

float과 double을 사용해야 할 때 명확하게 설명해 드렸습니다. 왜 그렇지 않습니까? –

+6

'float'과'double' 타입은 Java에서 통화에 가장 잘 사용되지 않습니다. 왜냐하면 반올림 오류의 기회를 열어주기 때문입니다. 이 기사는 더 자세히 설명합니다 : http://www.javapractices.com/topic/TopicAction.do?Id=13 – PPartisan

1

IEEE 표준에 따르면 float는 실수의 32 비트 표현이고 double은 64 비트 표현입니다.

Java 프로그램에서 우리는 대개 대부분 이중 데이터 형식을 사용합니다. 이중 데이터 유형을 사용하여 수용 할 수있는 숫자의 범위가 float이 사용될 때의 범위보다 많기 때문에 오버플로를 방지하는 것입니다.

또한 고정밀도가 필요한 경우에는 두 배 사용을 권장합니다. 오래 전에 구현 된 몇몇 라이브러리 메소드는 float 데이터 유형을 필수로 사용해야합니다 (즉, float 만 사용하여 구현 되었기 때문에!).

그러나 프로그램에 작은 숫자가 필요하고 float를 사용할 때 오버플로가 발생하지 않는다고 확신하면 float를 사용하면 float가 두 배로 필요한 메모리의 절반을 필요로하므로 공간 복잡성이 크게 향상됩니다.

2

자바는 그럼에도 불구하고 계산에 두 번 사용을 향한 편견 갖고있는 것 같아요 : 나는 부동 소수점을 사용하는 경우

점에서

케이스 내가 오늘 아침에 쓴 프로그램이 방법이 작동하지 않았다,하지만 내가 플로트를 교체 할 때 지금 잘 작동 (넷빈즈 IDE)에 이중으로 :

package palettedos; 
import java.util.*; 

class Palettedos{ 
    private static Scanner Z = new Scanner(System.in); 
    public static final double pi = 3.142; 

    public static void main(String[]args){ 
     Palettedos A = new Palettedos(); 
     System.out.println("Enter the base and height of the triangle respectively"); 
     int base = Z.nextInt(); 
     int height = Z.nextInt(); 
     System.out.println("Enter the radius of the circle"); 
     int radius = Z.nextInt(); 
     System.out.println("Enter the length of the square"); 
     long length = Z.nextInt(); 
     double tArea = A.calculateArea(base, height); 
     double cArea = A.calculateArea(radius); 
     long sqArea = A.calculateArea(length); 
     System.out.println("The area of the triangle is\t" + tArea); 
     System.out.println("The area of the circle is\t" + cArea); 
     System.out.println("The area of the square is\t" + sqArea); 
    } 

    double calculateArea(int base, int height){ 
     double triArea = 0.5*base*height; 
     return triArea; 
    } 

    double calculateArea(int radius){ 
     double circArea = pi*radius*radius; 
     return circArea; 
    } 

    long calculateArea(long length){ 
     long squaArea = length*length; 
     return squaArea; 
    } 
} 
+0

오늘도 같은 문제가있었습니다. 이 편향의 원인은 무엇일까요? – Shachi

0

예는 자바 플로트에서 지수 (8 다음 비트)는 가수 (23 우측의 비트) 기호 (가장 왼쪽 비트)을 추출하는 방법을 도시 .

int bits = Float.floatToIntBits(-0.005f); 
int sign = bits >>> 31; 
int exp = (bits >>> 23 & ((1 << 8) - 1)) - ((1 << 7) - 1); 
int mantissa = bits & ((1 << 23) - 1); 
System.out.println(sign + " " + exp + " " + mantissa + " " + 
    Float.intBitsToFloat((sign << 31) | (exp + ((1 << 7) - 1)) << 23 | mantissa)); 

double (11 비트 지수 및 52 비트 가수)에도 동일한 접근법을 사용할 수 있습니다.

long bits = Double.doubleToLongBits(-0.005); 
long sign = bits >>> 63; 
long exp = (bits >>> 52 & ((1 << 11) - 1)) - ((1 << 10) - 1); 
long mantissa = bits & ((1L << 52) - 1); 
System.out.println(sign + " " + exp + " " + mantissa + " " + 
    Double.longBitsToDouble((sign << 63) | (exp + ((1 << 10) - 1)) << 52 | mantissa)); 

신용 : 메모리 사용이 중요한 때 http://s-j.github.io/java-float/

관련 문제