2017-11-05 2 views
3

내 응용 프로그램에서 float 값을 사용하여 고객 점수를 보유하고 있습니다. 그리고 요구 사항에 따라 점수는 점 앞에 소수점 5 자리와 점 뒤에 3 자리수를 가질 수 있습니다.sysout 동안 float 값이 자동 증가하는 이유

예를 들어

: 99999.999

을하지만, SYSOUT를 사용하여 부동 소수점 값을 인쇄하는 동안 나는 이상한 행동을 이해하지 못했다.

public class Test { 
    public static void main(String[] args) { 
     float f1 = 9999.999f; 
     System.out.println(f1); 

     float f2 = 99999.999f; 
     System.out.println(f2); 
    } 
} 

을 그리고 출력은 다음과 같습니다 :

자세한 내용은 아래 예제 코드를 참조 값이 "99999.999은"자동 "100000.0"로 증가되었다 이유는 다음과 같습니다

9999.999 
100000.0 

을 SYSOUT를 사용하는 동안 ? 왜 지점 앞에서 네 자리 10 진수 값 (예 : "9999.999")을 사용하는 동안 동일한 문제가 발생하지 않았습니까?

의견을 보내 주시면 감사하겠습니다. 자바 사양

+6

수레에는 그 정도의 정밀도가 없습니다. – user2357112

+0

귀하의 질문은 오히려 기본 변환에서 앞뒤로 이동할 때 미리보기를 잃지 않고 부동 소수점의 소수 자리 수에 관한 것입니다. 이것 좀 봐> [https : //softwareengineering.stackexchange.com/questions/215065/can-anyone-explain-of-float-in-memory] (https://softwareengineering.stackexchange.com/questions/215065/can-anyone-explain-representation-of-float-in) -기억) – Infamous

답변

3

:

플로트 : 플로트 타입의 데이터는 단 정밀도 32 비트 IEEE 754 부동 소수점이다. 그 값의 범위는이 토론의 범위를 벗어나지 만 Java 언어 사양의 부동 소수점 유형, 형식 및 값 섹션에 지정되어 있습니다. 바이트 및 짧은에 대한 권장 사항과 마찬가지로 큰 숫자의 부동 소수점 배열에 메모리를 저장해야하는 경우 float (double 대신)를 사용하십시오. 이 데이터 형식은 통화와 같은 정확한 값에 사용해서는 안됩니다. 이를 위해서는 java.math.BigDecimal 클래스를 대신 사용해야합니다. 숫자와 문자열은 Java 플랫폼에서 제공하는 BigDecimal 및 기타 유용한 클래스를 다룹니다.

메모리를 절약하려는 경우에는 선결 계수 사용에 신경 쓰지 않으려면 float을 사용하고 그렇지 않으면 double을 사용하십시오. 자세한 정보는 여기 https://docs.oracle.com/javase/tutorial/java/nutsandbolts/datatypes.html

나는 BigDecimal 를 사용하고 경우에 대한 setScale 방법을 사용하는 것이 좋습니다.

3

float 모든 중요한 digits.This 수레가 7 유효 숫자까지 일반적으로 좋은 의미 보유는 "가수"에 대한 24 비트를 사용합니다. 당신의 수는 8 유효 숫자가있는 99999.999f입니다. 따라서 7 자릿수 뒤에 정밀도가 떨어지고 이런 종류의 오류는 7 자릿수가됩니다.

당신이 넣어하려고하면 : 이중 용도 53 비트는 "가수"정도 정확하게 약 16 자리를 유지할 수 있기 때문에 double f2 = 99999.999;

당신은 올바른 결과를 얻을 것이다.

관련 문제