[java基础原理] BigDecimal

本文深入解析了java.math包下的BigDecimal类,详细介绍了其内部结构,包括long型intCompact和scale的使用,以及如何通过这些属性实现更精确的数学运算。文章还提供了加、减、乘、除等操作的具体实现思路。

1.类 简化示例

 属于java.math包,因此包含各种数学运算,abs,pow等等。

package java.math;

public class BigDecimal { 
	//值的绝对long型表示
	private final transient long intCompact;
	//值的小数点后的位数
	private final int scale;

	private final BigInteger intVal;
	//值的有效位数,不包含正负符号
	private transient int precision;
	private transient String stringCache;
	
	//加、减、乘、除、绝对值
	public BigDecimal add(BigDecimal augend) {}
	public BigDecimal subtract(BigDecimal subtrahend) {}
	public BigDecimal multiply(BigDecimal multiplicand) {}
	public BigDecimal divide(BigDecimal divisor) {}
	public BigDecimal abs() {}
}

  

 2.对象简化示例

2.1 以long型的intCompact和scale来存储精确的值。

2.2 包含stringCache,因此创建BigDecimal对象时,优先转换成String类型,比如double转BigDecimal也是先double转成String,再String转成BigDecimal.

 

 

 

3.加减乘除的实现

加法:long类型 +

减法:转成加法,加负数

乘法:  long类型 *, 多些进位超界判断

除法:  long类型 /, 多些小数位数保留判断

private static long add(long xs, long ys){
  long sum = xs + ys;
  if ( (((sum ^ xs) & (sum ^ ys))) >= 0L) { // not overflowed
    return sum;
  }
  return INFLATED;
}

4.BigDecimal能更精确表示带小数点的数值,因为采用了long intCompact和int scale来表示数值,而不是浮点型的科学计数法。

 

转载于:https://www.cnblogs.com/ihzeng/p/10747803.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值