float 데이터 형식은 단 정밀도 32 비트 IEEE 754 부동 소수점이고 double 데이터 형식은 배정 밀도 64 비트 IEEE 754 부동 소수점입니다.
무슨 뜻인가요? 그리고 언제 double 대신 float를 사용해야합니까?
답변
위키 페이지 그것에는 시작하기에 좋은 장소입니다.
요약하면 :
-
float
는 1 비트 비트, 8 비트 지수 및 23 비트의 부호와 함께 32 비트로 표시됩니다 (또는 과학적 표기 번호 : 2.33728 * 10 12 ; 33728은 부호입니다). -
double
는 1 비트 비트, 11 비트 지수 및 52 비트의 부호를 갖는 64 비트로 표시됩니다.
기본적으로 Java는 double
부동 소수점 숫자를 나타 내기 위해 사용 합니다 (따라서 리터럴 3.14
은 유형이 지정됨 double
). 또한 훨씬 더 큰 숫자 범위를 제공하는 데이터 유형이므로을 (를) 사용하는 것이 좋습니다 float
.
특정 실제로 당신의 사용을 강제 라이브러리가있을 수 float
있지만, 일반적으로 – 당신이 당신의 결과에 맞게 충분히 작은 될 것이라고 보장 할 수없는 float
‘의 규정 범위 , 그것은으로 선택하는 것이 가장 좋습니다double
.
당신은 정확성이 필요한 경우 – 예를 들어, 당신은 (같은 부정확 진수 값을 가질 수 없습니다 1/10 + 2/10
), 또는 당신이하고있는 어떤 (시스템에 $ 10.33를 나타내는 예를 들어,) 통화와, 다음을 사용 BigDecimal
를 지원할 수있는을, 임의의 정밀도와 그런 상황을 우아하게 처리합니다.
답변
플로트는 대략 당신에게 준다. 6 자리는 소수점 이하 7 자리의 정밀도로 약 2 배가됩니다. 15-16. 또한 숫자의 범위는 두 배로 큽니다.
double은 8 바이트의 저장 공간이 필요하지만 float는 4 바이트 만 필요합니다.
답변
실수로도 알려진 부동 소수점 숫자는 분수 정밀도가 필요한 표현식을 평가할 때 사용됩니다. 예를 들어, 제곱근과 같은 계산 또는 사인 및 코사인과 같은 초월 계산에는 정밀도에 부동 소수점 유형이 필요한 값이 생성됩니다. Java는 표준 (IEEE–754) 부동 소수점 유형 및 연산자 세트를 구현합니다. 부동 소수점 유형에는 float 및 double의 두 가지 종류가 있으며, 각각 단일 및 배정도 숫자를 나타냅니다. 너비와 범위는 다음과 같습니다.
Name Width in Bits Range
double 64 1 .7e–308 to 1.7e+308
float 32 3 .4e–038 to 3.4e+038
흙손
float 유형은 32 비트 스토리지를 사용하는 단 정밀도 값을 지정합니다. 단 정밀도는 일부 프로세서에서 더 빠르며 배정 밀도의 절반만큼 공간을 차지하지만 값이 매우 크거나 작 으면 정확하지 않습니다. float 유형의 변수는 분수 구성 요소가 필요할 때 유용하지만 큰 정밀도를 요구하지는 않습니다.
float 변수 선언의 예는 다음과 같습니다.
부유물 고온, 저온;
더블
double 키워드로 표시되는 배정 밀도는 64 비트를 사용하여 값을 저장합니다. 고속 수학적 계산에 최적화 된 일부 최신 프로세서에서는 실제로 배정도가 단 정도보다 빠릅니다. sin (), cos () 및 sqrt ()와 같은 모든 초월 수학 함수는 double 값을 반환합니다. 많은 반복 계산에서 정확도를 유지해야하거나 값이 큰 숫자를 조작하는 경우 double이 가장 좋습니다.
답변
그럼에도 불구하고 Java는 계산에 double을 사용하는 것에 대한 편견이있는 것 같습니다.
필자가 오늘 앞서 작성한 프로그램에서 float을 사용할 때 메소드가 작동하지 않지만 float을 double로 대체하면 훌륭하게 작동합니다 (NetBeans 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;
}
}
답변
오류가 발생합니다.
public class MyClass {
public static void main(String args[]) {
float a = 0.5;
}
}
/MyClass.java:3 : 오류 : 호환되지 않는 유형 : double에서 float 로의 손실 가능한 변환 float a = 0.5;
이것은 완벽하게 작동합니다
public class MyClass {
public static void main(String args[]) {
double a = 0.5;
}
}
이것은 또한 완벽하게 작동합니다
public class MyClass {
public static void main(String args[]) {
float a = (float)0.5;
}
}
이유 : Java는 기본적으로 실수를 두 배로 저장하여 정밀도를 높입니다.
Double은 더 많은 공간을 차지하지만 계산 중에는 더 정확하고 float은 더 적은 공간을 차지하지만 덜 정밀합니다.
답변
IEEE 표준에 따르면 float는 실수의 32 비트 표현이고 double은 64 비트 표현입니다.
Java 프로그램에서는 일반적으로 이중 데이터 유형이 사용됩니다. double 데이터 형식을 사용하여 수용 할 수있는 숫자 범위가 float을 사용할 때의 범위보다 많기 때문에 오버플로를 피하기 만합니다.
또한 높은 정밀도가 필요한 경우에는 double을 사용하는 것이 좋습니다. 오래 전에 구현 된 라이브러리 메소드 중 일부는 여전히 float 데이터 유형을 필수로 사용해야합니다 (float를 사용하여 구현되었으므로 다른 것은 없습니다!).
그러나 프로그램에 작은 숫자가 필요하고 float를 사용할 때 오버플로가 발생하지 않을 것이라고 확신하는 경우 float를 사용하면 float에 필요한 메모리의 절반이 두 배로 필요하므로 공간 복잡성이 크게 향상됩니다.
답변
이 예제는 Java의 float에서 부호 (가장 왼쪽 비트), 지수 (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));
더블 (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));