2016-06-28 3 views
2

내가 서식을 적용하려고 (3 자리 숫자 후, 4 자리 이후 반올림)하고 작동하지 않습니다 - 코드 위에 DecimalFormat 코드 아래 사용하여 제대로

double a = 1231254125412512.231515235346; 
NumberFormat formatter = new DecimalFormat("#,###"); 
formatter.setRoundingMode(RoundingMode.HALF_UP); 
formatter.setMinimumFractionDigits(4); 
formatter.setMaximumFractionDigits(4); 
System.out.println("Number : " + formatter.format(a)); 

이 수 -54125412512.231515235346 (결과를 제대로 작동 -54,125,412,512.2315했다).

그러나 숫자 -1231254125412512.231515235346 (결과 -1,231,254,125,412,512.2000)에서 작동하지 않습니다.

+1

은 변수'a' float 또는 double입니까? – sidgate

+0

더블 더블 a = 1231254125412512.231515235346; – malviyarahuljayendra

+0

Double의 정밀도는 53 비트이므로 따라서 최대 값은 17 자리입니다. 1231254125412512.231515235346 ~ 1231254125412512.2 (17 자리) – ThiepLV

답변

1

문제는 double 변수이며 최대 정밀도는 Double.MIN_VALUE 입니다.

SOURCE: 이중

: 52 비트 가수 (15 ~ 17 진수, 평균 약 16)에 사용되는 64 비트 (8 바이트). 11 비트는 지수에 사용되고 1 비트는 부호 비트입니다.

대신이 문제를 사용 BigDecimal을 방지하려면 :

BigDecimal a = new BigDecimal("-54125412512.231515235346"); 
BigDecimal b = new BigDecimal("-1231254125412512.231515235346"); 

NumberFormat formatter = new DecimalFormat("#,###"); 
formatter.setRoundingMode(RoundingMode.HALF_UP); 
formatter.setMinimumFractionDigits(4); 
formatter.setMaximumFractionDigits(4); 
System.out.println("Number : " + formatter.format(a)); 
System.out.println("Number : " + formatter.format(b)); 

출력 :

Number : -54.125.412.512,2315 
Number : -1.231.254.125.412.512,2315 
+1

해결책은 맞지만 첫 번째 진술은 정확하지 않습니다. 1231254125412512.231515235346 Double.MIN_VALUE. 문제는 double은 너무 크고 정밀도가 높아서 반올림되는 숫자를 유지하는 정밀도가 없다는 것입니다. –

+0

@ErwinBolwidt가 소스를 수정하고 링크했습니다. 고마워요! –

+1

도움을 주셔서 감사합니다 !! 개념을 이해함 – malviyarahuljayendra

2

이중 약 16 자리 53 비트의 정밀도를 가지고있다.