BigDecimal函数使用

package com.study.test;

import java.math.BigDecimal;
import java.text.DecimalFormat;
import java.text.NumberFormat;


/**
 * 学习BigDecimal类
 * @author pyi
 *
 */
public class BigDecimalTest {
	
	
	public static void main(String[] args) {
		
		//构造器创建使用:
		BigDecimal a = new BigDecimal(3.89);
		BigDecimal b = new BigDecimal("3.89");
		BigDecimal c = BigDecimal.valueOf(3.89);
		
		p(a);
		p(b);
		p(c);
		
	/**
	 * 打印的结果如下
	 * 3.890000000000000124344978758017532527446746826171875
	 * 3.89
	 * 3.89
	 * 由此可以看出来在创建对象的时候,参数为double的时候得到的是一个不确定的值
	 * 所以在创建对象的时候尽量使用String类型的参数值
	 * 这里值得注意的是第三种方法的使用,这里是BigDecimal对double值的创建作了处理
	 * 调用静态方法valueOf即可实现double值转化为BigDecimal的转变
	 */
		
		//加减乘除方法实现(将所得到的值再转化为double类型)
		
		/**
		 * 值得注意的是:BigDecimal操作加减乘除的时候都是形成一个新的数而不是改变原来的数值
		 */
		
		BigDecimal d = a.add(b);
		BigDecimal e = a.subtract(b);
		BigDecimal f = a.multiply(b);
		//后面的数字表示发生除不尽的时候小数点以四舍五入保留多少位
		BigDecimal g = a.divide(b,2,BigDecimal.ROUND_HALF_UP);
		p(d.doubleValue());
		p(e.doubleValue());
		p(f.doubleValue());
		p(g.doubleValue());
		
		/**
		 * 由除法的公式我们可以在以后操作中得到精确的保留两位有效小数的四舍五入的值
		 */
		double h = BigDecimal.valueOf(13.141592654).divide(BigDecimal.valueOf(1), 2, BigDecimal.ROUND_HALF_UP).doubleValue();
		p(h);
		
		//接下来对数值格式化进行操作
		
		//方式一一般对于银行计算利率利息的时候先用金额乘以利率最后算利息
		NumberFormat currency = NumberFormat.getCurrencyInstance();//建立货币格式化的引用
		NumberFormat percent = NumberFormat.getPercentInstance();//建立百分比格式化的引用
		percent.setMaximumFractionDigits(1);//设置百分比的小数位最多是1位(格式化之后)
		String cuStr = currency.format(123456789.123456789);
		String peStr = percent.format(0.0568);
		p(cuStr);//¥123,456,789.12
		p(peStr);//5.7%
		//方式二:
		DecimalFormat df = new DecimalFormat("0.00");
		DecimalFormat df1 = new DecimalFormat("#.00");
		String dfStr = df.format(123456789.123456789);
		String df1Str = df1.format(123456789.123456789);
		p(dfStr);
		p(df1Str);
		//此时两种格式是没有区别的 123456789.12 小数点后面0就是代表保留几位数值
		String dfStr1 = df.format(0.123456789);
		String df1Str1 = df1.format(0.123456789);
		p(dfStr1);//0.12
		p(df1Str1);//.12这里就是区别了,所以平时使用的时候就要注意常用0.00的方式
		
		/**
		 * 总结如下:
		 * 一般在要求四舍五入整数时用round函数即可
		 * 再要求精确到小数点后面几位的四舍五入的时候可用BigDecimal的除法方法解决问题
		 * 在遇到页面显示货币值显而易见要用到NumberFormat的方法(也可以用JSTL表达式<fmt:...)
		 * 在遇到针对两数相除得到百分比的时候可结合除法和NumberFormat实现
		 * DecimalFormat用起来也是比较方便,遇到一个逻辑多次调用数字格式化时可选用这个
		 */
	
		
		
	}
	
	public static void p(Object o){
		System.out.println(o);
	}

}

猜你喜欢

转载自blog.csdn.net/qq844579582/article/details/52711623