Java中处理数值计算(基本类型,引用类型及 BigDecimal 使用解析)

目录

 

一:数值计算分析

1.基本数据类型  和  引用数据类型 不同点解析

2.加减乘除是否会影响精确度

3.科学计数法

4.混合运算时的解决办法

二:为何选择BigDecimal

5.浮点数的计算为什么有误差:(存储方式:科学计数法)

6.使用 BigDecimal    和 Double 之间的不同点

7,BigDecimal 的运算能力

8.资源点


一:数值计算分析

1.基本数据类型  和  引用数据类型 不同点解析

(1)运算排除 null 情况

(2)不同数据类型的转换时,排除了null 情况

2.加减乘除是否会影响精确度

(1)乘,除的本质上是: 移位运算和加,减法获取的

(2)加,减法的本质上是: “异或”和“或”  的操作实现的 

  so 对于精确度无影响

3.科学计数法

定义:一种记数的方法:把一个数表示成a与10的n次幂相乘的形式(1≤a<10,n为整数)

例子:“0E-20”

什么时候出现?

当数字过大或过小时,java会用科学计数法展示    

4.混合运算时的解决办法

(1)统一使用 Object 进行接收
(2)进行 非null校验,是否为数字校验即可
(3)转化为String对象,统一计算
(4)使用自带的API :如 BigDecimal 比较使用 compareTo()
          最好不使用 算数运算符号 ( == )等

(arg2==0 || arg2==null)
 假如 arg2 为Double封装类型,并且为null 时,
 用它判断会出错

二:为何选择BigDecimal

5.浮点数的计算为什么有误差:(存储方式:科学计数法)

进行计算时,都需要转换为二进制

例子: 
      二进制小数(10010.1110)= 1 * 24 + 0 * 23 + 0 * 22 + 1 * 21 + 0 * 20 + 1 * 2-1 + 1 * 2-2 + 1 * 2-3 +  0 * 2-4 = 16 + 2 + 1/2 + 1/4 + 1/8 
  得出结论:有的浮点数是没有办法是用二进制进行精确表示,只能获取无限接近的值
   类似: 0.1 , 1/3  时,都无法去表示!

6.使用 BigDecimal    和 Double 之间的不同点

BigDecimal 操作类专门有一个工厂方法来处理二进制位数溢出(操作系统原理有讲过)的状况
而Double 没有,只适合来使用科学计数法来表示

7,BigDecimal 的运算能力

(1)在构造时,使用非浮点数去进行声明即可!BigDecimal bigdecimal = new BigDecimal(String,MathContext);
(2)bigDecimal 的运算位数:  理论上可以无限大,取决于你使用的电脑内存位数 :) 
(3)位数方面:
                配置 MathContext 即可
                并且传递参数时,不要进行拆装箱的操作,以免精度的丢失

8.资源点

   ArithUtil片段:

/**
	 * 提供精确的加法运算 .
	 * @param v1  被加数 .
	 * @param v2 加数 .
	 * @return 两个参数的和 .
	 */

	public static double add(double v1, double v2) {
		BigDecimal b1 = new BigDecimal(Double.toString(v1));
		BigDecimal b2 = new BigDecimal(Double.toString(v2));
		return round(b1.add(b2).doubleValue(),DEF_SCALE);
	}
	
	/**
	 * 提供精确的加法运算 .
	 * @param v1  被加数 .
	 * @param v2 加数 .
	 * @param scale 保留小数位数 .
	 * @return 两个参数的和 .
	 */

	public static double add(double v1, double v2,int scale) {
		BigDecimal b1 = new BigDecimal(Double.toString(v1));
		BigDecimal b2 = new BigDecimal(Double.toString(v2));
		return round(b1.add(b2).doubleValue(),scale);
	}
	

   ArithMoreUtil片段:

/**   
	* @Fields maxContext : 数值范围限定 .
	*/
	private static MathContext maxContext;
	
	static {
		//UNLIMITED 
		//DECIMAL64 
		//DECIMAL32 
		maxContext = MathContext.DECIMAL128;
	}

	/**   
	* 

Title:

. *

Description:

. */ private ArithMoreUtil() { } /** * 提供精确的加法运算 . * @param v1 被加数 . * @param v2 加数 . * @return 两个参数的和 . */ public static BigDecimal add(String v1, String v2) { BigDecimal b1 = new BigDecimal(v1,maxContext); BigDecimal b2 = new BigDecimal(v2,maxContext); return b1.add(b2); } /** * 提供精确的减法运算 . * @param v1 被减数 . * @param v2 减数 . * @return 两个参数的差 . */ public static BigDecimal sub(String v1, String v2) { BigDecimal b1 = new BigDecimal(v1,maxContext); BigDecimal b2 = new BigDecimal(v2,maxContext); return b1.subtract(b2); }

限于篇幅问题,可以到我的资源点(自动的标了5C币。。。 有人告诉我怎么设置么? :))

你可能感兴趣的:(※,工具记录)