刚在网上看到的,看了下问题确实如此, 为什么 333.525 被四舍了 ,而不是五入呢 ?public static void main(String[] args)
{
NumberFormat nf = NumberFormat.getInstance();
nf.setMinimumIntegerDigits(4);
nf.setMaximumFractionDigits(2);
System.out.println(nf.format(333.525));
System.out.println(nf.format(333.52500001));
}输出:
0,333.52
0,333.53
{
NumberFormat nf = NumberFormat.getInstance();
nf.setMinimumIntegerDigits(4);
nf.setMaximumFractionDigits(2);
System.out.println(nf.format(333.525));
System.out.println(nf.format(333.52500001));
}输出:
0,333.52
0,333.53
不过只要你明确指定四舍五入的模式应该没有问题。。NumberFormat nf = NumberFormat.getInstance();
nf.setRoundingMode(RoundingMode.HALF_UP);
nf.setMinimumIntegerDigits(4);
nf.setMaximumFractionDigits(2);
System.out.println(nf.format(333.525));
System.out.println(nf.format(333.52500001));
第一种情况没走进。private final void round(int maximumDigits) {
// Eliminate digits beyond maximum digits to be displayed.
// Round up if appropriate.
if (maximumDigits >= 0 && maximumDigits < count) {
if (shouldRoundUp(maximumDigits)) {
// Rounding up involved incrementing digits from LSD to MSD.
// In most cases this is simple, but in a worst case situation
// (9999..99) we have to adjust the decimalAt value.
for (;;) {
--maximumDigits;
if (maximumDigits < 0) {
// We have all 9's, so we increment to a single digit
// of one and adjust the exponent.
digits[0] = '1';
++decimalAt;
maximumDigits = 0; // Adjust the count
break;
} ++digits[maximumDigits];
if (digits[maximumDigits] <= '9') break;
// digits[maximumDigits] = '0'; // Unnecessary since we'll truncate this
}
++maximumDigits; // Increment for use as count
}
count = maximumDigits; // Eliminate trailing zeros.
while (count > 1 && digits[count-1] == '0') {
--count;
}
}
}
看了下源码NumberFormat的RoundingMode决定着处理方式,默认为 ROUND_HALF_EVEN , 下面是几个参数的解释 :
1. ROUND_CEILING
如果BigDecimal是正的,则做ROUND_UP操作;如果为负,则做ROUND_DOWN操作。
2. ROUND_DOWN
从不在舍弃(即截断)的小数之前增加数字。
3. ROUND_FLOOR
如果BigDecimal为正,则作ROUND_UP;如果为负,则作ROUND_DOWN。
4. ROUND_HALF_DOWN
若舍弃部分>.5,则作ROUND_UP;否则,作ROUND_DOWN。
5. ROUND_HALF_EVEN
如果舍弃部分左边的数字为奇数,则作ROUND_HALF_UP;如果它为偶数,则作 ROUND_HALF_DOWN 。
6. ROUND_HALF_UP
若舍弃部分>=.5,则作ROUND_UP;否则,作ROUND_DOWN。
7. ROUND_UNNECESSARY
该“伪舍入模式”实际是指明所要求的操作必须是精确的,,因此不需要舍入操作。
8. ROUND_UP
总是在非0舍弃小数(即截断)之前增加数字。