2017-02-09 8 views
0

"."문자 다음에 정확히 2 자리 숫자로 문자열을 가져 오는 경우. 내가 좋아하는 뭔가를 할 수 있습니다2 자리 숫자로 인쇄하지만 6 자리 숫자로 끝나는 인쇄 번호

 DecimalFormat df = (DecimalFormat)DecimalFormat.getInstance(Locale.US); 
     df.applyPattern("0.00"); 
     df.setRoundingMode(RoundingMode.HALF_UP); 
     String output = df.format(value); 

내가 같은 숫자 828.054999999702d이있는 경우, 다음 자리가 "4"를 말한다 이후 지금까지 올바른 무엇 828.05로 포맷하고는 아무것도 그 내림합니다 .

그러나 더 많은 자릿수 정밀도를 보존해야한다면 어떻게 보이게할까요?

 double prettyValue = value; 
     prettyValue = Math.round(prettyValue * 1000000d)/1000000d; 
     prettyValue = Math.round(prettyValue * 100000d)/100000d; 
     prettyValue = Math.round(prettyValue * 10000d)/10000d; 
     prettyValue = Math.round(prettyValue * 1000d)/1000d; 
     prettyValue = Math.round(prettyValue * 100d)/100d; 
     DecimalFormat df = (DecimalFormat)DecimalFormat.getInstance(Locale.US); 
     df.applyPattern("0.00"); 
     df.setRoundingMode(RoundingMode.HALF_UP); 
     String output = df.format(prettyValue); 

이 제 3 회 6, 5, 4를 반올림하고 다음 두 번째 장소를하는 경우, NumberFormat 아무것도 할 필요가 없습니다 있었으나 결국이 나머지를 인쇄 :

은 내가 빠르게 생성하면이 작업 코드 자릿수는 0이됩니다.

하지만 이미 알지 못하는 즉시 사용 가능한 반올림이 있어야한다고 생각합니다. BigDecimal을 사용하여 동일한 작업을 수행하면 나와 동일한 문제가 발생합니다.

내가 원하는 결과는 828.054999999702을 반올림하여 828.06입니다.

+0

출력을 포맷 할 때 반올림 해 보라. – Thomas

+0

* "더 많은 자릿수의 정밀도를 유지해야한다면 무엇을 표시하고 싶지 않으십니까?"* 의미는 무엇입니까? 디스플레이의 형식 지정은 정밀도 유지와 관련이 있습니까? 형식이 지정된 텍스트가 보존 대상인 경우 보존에 필요한 모든 숫자를 표시해야합니다. 그렇지 않은 경우 값이 보존되면 문제는 무엇입니까? 나는 혼란스러워. – Andreas

답변

2

는 내가 완전히 귀하의 질문에 그렇게 나에게 요점을 되풀이하자 이해 확실하지 않다 :

  • 당신은 잠재적으로 더 6에 비해 상당 부분 자리 일부 double 값을 갖는다.
  • 그 값을 6 소수 자릿수로 반올림하고 HALF_UP 모드를 사용하려고합니다.
  • 처음 2 자릿수 만 표시하고 싶습니다 (왜 그런지는 모르지만 질문하지 않을 것입니다).

그 경우에는 내가 그렇지 않으면 당신은 정밀 오류를 얻을 수 있기 때문에 처음 라운딩 BigDecimal을 사용하는 것이 좋습니다 것 :

double value = 1.23456789; 
BigDecimal rounded = BigDecimal.valueOf(value).setScale(6, RoundingMode.HALF_UP); 

1.234568 될 것을.

당신이했던 것처럼 그런 NumberFormat를 사용하지만 항상 내림 : 1.23

DecimalFormat df = (DecimalFormat)DecimalFormat.getInstance(Locale.US); 
df.applyPattern("#.##"); 
df.setRoundingMode(RoundingMode.DOWN); 
String output = df.format(rounded); 

을 초래한다고.

입력 값이 4.23499999999235 인 경우 4.235000 (6 자리로 반올림 됨) 및 4.23이 표시됩니다.

편집 : 나는 4.244.23499999999235 반올림 반올림 모드를 잘 모르는 것 같아요하지만 당신은 여러에게 setScale() 호출 체인에 의해 그것을 달성 할 수 있어야한다 : 분수 자리에 반올림 적용해야

BigDecimal rounded = BigDecimal.valueOf(value); 
for(int digit = 6; digit >= 2; digit--) { 
    rounded = rounded .setScale(digit, RoundingMode.HALF_UP); 
} 

을 6, 5 등으로 끝나고 마지막으로 4.24으로 돌아갑니다. 나는 그것이 올바른 방법이라고 확신하지는 못하지만 나보다 나은 요구 사항을 알고있다.

+0

이것은 올바른 생각 인 것 같습니다. 하지만 여전히 HALF_UP을 사용해야합니다. 그러면 결과는 내가 원했던 것입니다. 나는 다른 번호 (디버깅의 실제 예)를 사용하여 질문을 편집하여 그것을 명확히했다. – Jens

+0

@Jens 어떤 경우에도'828.xx'가'4.23'으로 반올림되지 않기 때문에 질문을 다시 편집 할 수 있습니다.) – Thomas

+0

@Jens는 설명 된대로 적어도 하나의 방법으로 내 편집을 봅니다. – Thomas

0

고려하면 문자열이 출력된다, 왜 안 대신에 DecimalFormat 물건의 모든

String output = String.format(java.util.Locale.US,"%.2f", doubleValue); 

를 사용할 수 있습니까? 이렇게하면 doubleValue가 원래 값으로 유지되고 정밀도가 유지됩니다.

+0

심지어 이것이 내 예제 코드를 줄여도 아무 것도 변경하지 않을 것입니다. 문자열 "출력"에는 2 자리 이상의 정밀도로 반올림되지 않은 숫자가 포함됩니다. 문자열 형식은 위치 3에서 9999를 모두 고려하지 않고 4를 반올림합니다. – Jens

+0

4.2349999를 4.24로 "반올림"할까요? 이것은 잘못 반올림 한 것처럼 보입니다. 그렇지 않으면 나는 2에 ​​도달 할 때까지 당신이 한 일을하고 더 높은 자리에서 더 낮은 자리로 반올림했을 것입니다. – igoldthwaite

+0

나는 그것이 잘못된 반올림이 아니라고 생각합니다. 예를 들어 금융 시스템은 6 자리 숫자로 모든 것을 계산하지만 2 자리 숫자 만 표시하는 제약이 종종 있습니다. 하지만 금융 분야에서는 BigDecimal도 사용합니다. – Jens