BigInteger、BigDecimal、数字格式化
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
上一篇: sklearn决策树与随机森林 参数及规则提取 模型可视化(初体验)
下一篇: 决策树 随机森林