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 时原样输出。


设置精度( scale ) 和舍入方式

	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
注意:setScale( ) 方法会返回一个BigDecimal ,要对这个对象操作才有效。这是一个“ Value-Object”,每次操作返回一个新对象。

对没法精确表示的(除法),抛出异常

		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;
	}



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值