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 오브젝트와 함께 호출되는 경우
NumberFormat 및 DecimalFormat 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에 반하는 버그 보고서를 포함하여
추가 정보를 제공하고 다수의 관련된 보고서를 표시합니다.
영향을 받는 클래스에 대한 자세한 정보는 다음을 참조하십시오.