NumberFormat 및 DecimalFormat 형식 메소드 반올림의 동작 변경

Java 8에서는 format 메소드를 사용하여 10진수의 반올림 동작에서 동작 변경을 도입했습니다. java.text.NumberFormat java.text.DecimalFormat 클래스는 값이 동률에 매우 근접할 때 형식화 패턴에 지정된 반올림 위치에 정확하게 배치됩니다. 이 변경은 정확하지 않은 2진 숫자 표시의 수에 적용됩니다.

예를 들어, 컴퓨터가 도달할 수 있는 0.015의 가장 가까운 2진 추정치는 0.01499999999999999944488848768742172978818416595458984375입니다. 해당 수를 2개의 숫자로 버림하는 경우 Java 8에서 .004999999....가 .005 미만이므로 답은 .01입니다. 이전 버전의 Java에서는 답이 0.02입니다.

이 규칙은 첫 번째 매개변수로 double 프리머티브 또는 java.lang.Double 오브젝트와 함께 호출되는 경우 NumberFormatDecimalFormat format 메소드에 대한 호출에 플래그를 지정합니다. 다음 예제에서는 format 메소드의 사용을 표시합니다.

public static void main(String[] args) {

java.text.NumberFormat nf = java.text.NumberFormat.getInstance();
nf.setMaximumFractionDigits(3);
double aDouble;
String myStr;

aDouble = 0.8055d;
myStr = nf.format(aDouble);
System.out.println("format ("+ aDouble +") \" "+ myStr +" \" 을 리턴합니다. \"0.805\"." 예상);

nf.setMaximumFractionDigits(2);
aDouble = 0.015d;
myStr = nf.format(aDouble);
System.out.println("format ("+ aDouble +") \" "+ myStr +" \" 을 리턴합니다. \"0.01\"이어야 합니다.");


NumberFormat percent = NumberFormat.getPercentInstance();
percent.setMinimumFractionDigits(1);
percent.setMaximumFractionDigits(1);
percent.setRoundingMode(RoundingMode.HALF_EVEN);
myStr = percent.format(0.5555);
System.out.println("format (0.5555) 은 \""+ myStr +" \" 을 리턴합니다. \"55.5% \". " 예상);

}

Java 7을 통해 이 코드를 호출하는 경우 다음 출력이 표시됩니다.

format(0.8055) returns "0.806". Expecting "0.805".
format(0.015) returns "0.02". Expecting "0.01".
format(0.5555) returns "55.6%". Expecting "55.5%".

Java 8에서는 다음 출력이 표시됩니다.

format(0.8055) returns "0.805". Expecting "0.805".
format(0.015) returns "0.01". Expecting "0.01".
format(0.5555) returns "55.5%". Expecting "55.5%".

프로그램 출력에 영향을 미칠 수 있으므로 이 동작 변경을 주의하십시오. JDK-7131459 버그 보고서에서는 이를 회귀로 보고하는 Java 8에 반하는 버그 보고서를 포함하여 추가 정보를 제공하고 다수의 관련된 보고서를 표시합니다.

영향을 받는 클래스에 대한 자세한 정보는 다음을 참조하십시오.