以下是代码:
public static void main(String[] args) {
formatNumber("##.##", 0.125);
formatNumber("##.##", 0.165);
}
public static void formatNumber(String pattern, double value) {
formatter.applyPattern(pattern);
String formattedNumber = formatter.format(value);
System.out.println("Number:" + value + ", Pattern:" +
pattern + ", Formatted Number:" +
formattedNumber);
}
我得到了这个输出。
Number:0.125, Pattern:##.##, Formatted Number:0,12
Number:0.165, Pattern:##.##, Formatted Number:0,17
我知道默认情况下它使用HALF_EVEN舍入模式。 例如,5.5将四舍五入为6,并且为6.5到6。 但是,如果我在小数点后面有超过1位数,那么该规则是如何应用的。我不明白。提前感谢您的时间。
答案 0 :(得分:2)
舍入规则仍然正确应用,但最初并未显示。这显示为“0.17”,因为0.165不能精确表示为浮点double
;表示的价值略高于0.165。
数字0.125
可以准确表示(2 -3 ),因此它会正确向下舍入到0.12
以进行显示。
但是数字0.165
只显示应向下舍入。
System.out.println(Long.toHexString(Double.doubleToLongBits(0.165)));
十六进制表示是
3fc51eb851eb851f
尾数是最后13个十六进制数字,它建立重复的十六进制“51eb8”,但最后一个十六进制数字向上舍入为“f”,因此浮点表示的值略大于实际数学数字0.165。因此,它被四舍五入显示为“0.17”。