一、BigDecimal类
/**
* BigDecimal
* 不可变的、任意精度的有符号十进制数
* BigDecimal 由任意精度的整数非标度值 和 32 位的整数标度 (scale) 组成。
* 如果为零或正数,则标度是小数点后的位数。如果为负数,则将该数的非标度值乘以 10 的负 scale 次幂
* BigDecimal 类提供以下操作:算术、标度操作、舍入、比较、哈希算法和格式转换。
* toString() 方法提供 BigDecimal 的规范表示形式。
* BigDecimal 类使用户能完全控制舍入行为。
*/
public class BigDecimal extends Number implements Comparable<BigDecimal>
{
//构造方法
//将 double 转换为 BigDecimal,后者是 double 的二进制浮点值准确的十进制表示形式
public BigDecimal(double val){}
/**
* 将 BigDecimal 的字符串表示形式转换为 BigDecimal。
* 字符串表示形式由可选符号 '+' ('\u002B') 或 '-' ('\u002D') 组成,后跟零或多个十进制数字(“整数”)的序列,
* 可以选择后跟一个小数,也可以选择后跟一个指数。
*/
public BigDecimal(String val){}
//常用方法
//返回一个 BigDecimal,其值为 (this + augend),其标度为 max(this.scale(), augend.scale())。
public BigDecimal add(BigDecimal augend){}
//返回一个 BigDecimal,其值为 (this - subtrahend),其标度为 max(this.scale(), subtrahend.scale())。
public BigDecimal subtract(BigDecimal subtrahend){}
//返回一个 BigDecimal,其值为 (this × multiplicand),其标度为 (this.scale() + multiplicand.scale())。
public BigDecimal multiply(BigDecimal multiplicand){}
//返回一个 BigDecimal,其值为 (this / divisor),其标度为指定标度。如果必须执行舍入,以生成具有指定标度的结果,则应用指定的舍入模式。
public BigDecimal divide(BigDecimal divisor,
int scale,
RoundingMode roundingMode){}
//返回 BigDecimal,其标度为指定值
public BigDecimal setScale(int newScale,
RoundingMode roundingMode){}
//返回根据 MathContext 设置进行舍入后的 BigDecimal。如果精度设置为 0,则不进行任何舍入操作。
public BigDecimal round(MathContext mc){}
}
二、MathContext类
/**
* MathContext
* 该对象是封装上下文设置的不可变对象,它描述数字运算符的某些规则,例如由 BigDecimal 类实现的规则。
* 基本独立设置为:
* precision:某个操作使用的数字个数;结果舍入到此精度
* roundingMode:一个 RoundingMode 对象,该对象指定舍入使用的算法。
*/
public final class MathCont implements Serializable
{
//构造方法
//构造一个新的 MathContext,它具有指定的精度和 HALF_UP 舍入模式。
public MathContext(int setPrecision){}
//构造一个新的 MathContext,它具有指定的精度和舍入模式。
public MathContext(int setPrecision,
RoundingMode setRoundingMode){}
//根据字符串构造一个新的 MathContext。 该字符串的格式必须与 toString() 方法生成的字符串的格式相同。
public MathContext(String val){}
//常用方法
//回 precision 设置。此值始终为非负数。
public int getPrecision(){}
//返回 roundingMode 设置
public RoundingMode getRoundingMode(){}
//返回此 MathContext 的字符串表示形式,例如: “precision=9 roundingMode=HALF_UP”
public String toString(){}
}
三、RoundingMode枚举
/**
* RoundingMode
* 为可能丢弃精度的数值操作指定一种舍入行为
* 此 enum 拟用于取代 BigDecimal(BigDecimal.ROUND_UP、BigDecimal.ROUND_DOWN 等)中舍入模式常量的基于整数的枚举。
*/
public enum RoundingMode extends Enum<RoundingMode>
{
CEILING, //向正无限大方向舍入的舍入模式。
DOWN, //向零方向舍入的舍入模式。
FLOOR, //向负无限大方向舍入的舍入模式。
HALF_DOWN, //向最接近数字方向舍入的舍入模式,如果与两个相邻数字的距离相等,则向下舍入
HALF_EVEN, //向最接近数字方向舍入的舍入模式,如果与两个相邻数字的距离相等,则向相邻的偶数舍入。
HALF_UP, //向最接近数字方向舍入的舍入模式,如果与两个相邻数字的距离相等,则向上舍入。
UP, //远离零方向舍入的舍入模式。
UNNECESSARY //用于断言请求的操作具有精确结果的舍入模式,因此不需要舍入
}
四、示例
import java.math.*;
class BigDecimalDemo
{
public static void main(String[] args)
{
String num1 = "2135484.23588";
String num2 = "0005.2";
System.out.println(num1+" + "+num2+" = "+add(num1,num2));
System.out.println(num1+" - "+num2+" = "+sub(num1,num2));
System.out.println(num1+" * "+num2+" = "+mul(num1,num2));
System.out.println(num1+" / "+num2+" = "+div(num1,num2,5));
System.out.println("********************************");
MathContext mc = new MathContext(3,RoundingMode.HALF_UP);
System.out.println(num1+" + "+num2+" = "+add(num1,num2).round(mc));
System.out.println(num1+" - "+num2+" = "+sub(num1,num2).round(mc));
System.out.println(num1+" * "+num2+" = "+mul(num1,num2).round(mc));
System.out.println(num1+" / "+num2+" = "+div(num1,num2,5).round(mc));
System.out.println("********************************");
System.out.println(num1+" + "+num2+" = "+add(num1,num2).setScale(3,RoundingMode.HALF_UP));
System.out.println(num1+" - "+num2+" = "+sub(num1,num2).setScale(3,RoundingMode.HALF_UP));
System.out.println(num1+" * "+num2+" = "+mul(num1,num2).setScale(3,RoundingMode.HALF_UP));
System.out.println(num1+" / "+num2+" = "+div(num1,num2,5).setScale(3,RoundingMode.HALF_UP));
}
//加
public static BigDecimal add(String num1,String num2)
{
BigDecimal bi1 = new BigDecimal(num1);
BigDecimal bi2 = new BigDecimal(num2);
return bi1.add(bi2);
}
//减
public static BigDecimal sub(String num1,String num2)
{
BigDecimal bi1 = new BigDecimal(num1);
BigDecimal bi2 = new BigDecimal(num2);
return bi1.subtract(bi2);
}
//乘
public static BigDecimal mul(String num1,String num2)
{
BigDecimal bi1 = new BigDecimal(num1);
BigDecimal bi2 = new BigDecimal(num2);
return bi1.multiply(bi2);
}
//除
public static BigDecimal div(String num1,String num2,int scale)
{
BigDecimal bi1 = new BigDecimal(num1);
BigDecimal bi2 = new BigDecimal(num2);
return bi1.divide(bi2,scale,RoundingMode.HALF_UP);
}
}