欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

BigInteger、BigDecimal、数字格式化

程序员文章站 2022-04-08 13:54:31
...

BigInteger与BigDecimal的目的是用来精确地表示大整数和小数,常用于商业计算中。

BigInteger:支持任意精度的整数,可以精确地表示任意大小的整数值,同时在运算过程中不会丢失任何信息。
BigDecimal:可以精确地表示任意精度的小数,同时在运算过程中不会丢失任何信息。

BigInteger与BigDecimal都是不可变的(immutable)的,在进行每一步运算时,都会产生一个新的对象,由于创建对象会引起开销,因此它们不适合于大量的数学运算。

BigDecimal够造方法的参数类型有4种,其中的两个用BigInteger构造,另一个是用double构造,还有一个使用String构造。

 

应该避免使用double构造BigDecimal,因为:有些数字用double根本无法精确表示,传给BigDecimal构造方法时就已经不精确了。比如,new BigDecimal(0.1)得到的值是0.1000000000000000055511151231257827021181583404541015625。使用new BigDecimal("0.1")得到的值是0.1。因此,如果需要精确计算,用String构造BigDecimal,避免用double构造,尽管它看起来更简单!

equals()方法认为0.1和0.1是相等的,返回true,而认为0.10和0.1是不等的,结果返回false。方法compareTo()则认为0.1与0.1相等,0.10与0.1也相等。所以在从数值上比较两个BigDecimal值时,应该使用compareTo()而不是 equals()。

另外还有一些情形,任意精度的小数运算仍不能表示精确结果。例如,1除以9会产生无限循环的小数 .111111...。出于这个原因,在进行除法运算时,BigDecimal可以让您显式地控制舍入。

数字格式话一般会用到DecimalFormat、NumberFormat或则String.format:

DecimalFormat df1 = new DecimalFormat("#,###.000");
		System.out.println(df1.format(123456789.527));//1,234.527

		DecimalFormat df2 = new DecimalFormat("#.00");
		System.out.println(df2.format(1234.527));//1234.53,有四舍五入
		
		DecimalFormat df3 = new DecimalFormat("##.00%");    //##.00%   百分比格式,后面不足2位的用0补齐
		System.out.println(df3.format(0.527));//52.70%

		NumberFormat nf = NumberFormat.getPercentInstance();
		nf.setMinimumFractionDigits(3);    // 保留到小数点后几位
		System.out.println(nf.format(0.527));//52.700%

		System.out.println(String.format("%02d", 5));//05
		System.out.println(String.format("%.3f", 3.14159));//3.142,%. 表示小数点前任意位数, 2 表示两位小数, f 表示浮点型

		NumberFormat format = NumberFormat.getNumberInstance();
		format.setMinimumFractionDigits(3);//设置小数部分允许的最小位数
		format.setMaximumFractionDigits(5);//设置小数部分允许的最大位数
		format.setMaximumIntegerDigits(10);//设置整数部分允许的最大位数。
		format.setMinimumIntegerDigits(0);//设置整数部分允许的最小位数
		System.out.println(format.format(2132323213.23266666666)); 

 文章出处:http://blog.csdn.net/zero__007/article/details/51326496

相关标签: java java基础