BigDecimal 运用示例 与 DecimalFormat

		BigDecimal bd = new BigDecimal( "99.11" );
System.out.println( "scale=" + bd.scale() );
System.out.println(bd);

bd = new BigDecimal( 5526 );
bd = bd.divide( new BigDecimal (1000) );
System.out.println( "scale=" + bd.scale() );
System.out.println(bd);
System.out.println( "doubleValue=" + bd.doubleValue());

bd = new BigDecimal( 23.256 );
System.out.println( "--scale=" + bd.scale() );
System.out.println(bd);
System.out.println( "--doubleValue=" + bd.doubleValue());

1、如果传入的是字符串，则会自动计算“标度”，直接输出的字符串也是“精确的”

2、如果传入的是整数，且除以10 的 N 次幂，结果依然精确（即使是转换成 double）

3、如果传入的是 double，BigDecimal 内部保存的“标度”为45，转换回double 时原样输出。

	static void testScale(){
BigDecimal bd = new BigDecimal( 23/7.0 );
System.out.println( "Before:" + bd.doubleValue() );
double d = bd.setScale( 2, BigDecimal.ROUND_HALF_UP ).doubleValue();
System.out.println( "After:" + d );
}

Before:3.2857142857142856
After:3.29

		bd = new BigDecimal( 2655 );
bd = bd.divide( new BigDecimal (122) );
System.out.println( "scale=" + bd.scale() );
System.out.println(bd);
System.out.println( "doubleValue=" + bd.doubleValue());

DecimalFormat 格式化数字

	// . . .
String formatNumber( BigDecimal number ){

DecimalFormat decimalFormat = new DecimalFormat( "##.##" );
decimalFormat.setMinimumFractionDigits( 2 );
decimalFormat.setMaximumFractionDigits( 2 );
String numberStr = decimalFormat.format( number );

// 长度不够，补前导空格(如 "1.22" 应为 " 1.22")
final int FORMAT_STRING_LENGTH = 5;
if( numberStr.length() < FORMAT_STRING_LENGTH ){
numberStr = addPreBlank( numberStr, FORMAT_STRING_LENGTH );
}

return numberStr;
}

String addPreBlank( String str, int formatLength ){
assert str != null;
assert !str.trim().equals("");
assert str.length() < formatLength;

final String ONE_BLANK = " ";
int sub = formatLength - str.length();
StringBuilder sb = new StringBuilder();
for( int i = 0 ; i < sub ; i++ ){
sb.append( ONE_BLANK );
}

return sb.toString() + str;
}

• 写评论