mathcontext保留2位小数_BigDecimal 小数 浮点数 精度 财务计算

本文介绍了Java中BigDecimal和MathContext的使用,以实现精确的财务计算。BigDecimal用于处理超过16位有效数,提供精确的运算,而MathContext用于设定运算精度和舍入模式。在进行财务计算时,由于float和double的精度问题,应当避免使用,转而使用BigDecimal确保结果准确性。MathContext的精度设置和舍入模式选择对于结果至关重要,例如在需要2位小数时,应使用MathContext.DECIMAL128或自定义精度为2的MathContext。
摘要由CSDN通过智能技术生成

简介

float和double类型的使用局限:

单精度浮点型变量float可以处理6~7位有效数,双精度浮点型变量double可以处理15~16位有效数,在实际应用中,如果需要对更大或者更小的数进行运算和处理,这时候float和double就如能为力了。

借用《Effactive Java》这本书中的话,float和double类型的主要设计目标是为了科学计算和工程计算,他们执行二进制浮点运算,这是为了在广域数值范围上提供较为精确的快速近似计算而精心设计的。然而,它们没有提供完全精确的结果,所以不应该被用于要求精确结果的场合。但是,商业计算往往要求结果精确,这时候BigDecimal就派上大用场啦。

BigDecimal

public class BigDecimal extends Number implements Comparable

BigDecimal用来对超过16位有效位的数进行精确的运算。BigDecimal所创建的是对象,我们不能使用传统的+、-、*、/等算术运算符直接对其对象进行数学运算,而必须调用其相对应的方法。方法中的参数也必须是BigDecimal的对象。

BigDecimal 由【任意精度的整数非标度值】和【32 位的整数标度 (scale)】组成。如果为零或正数,则标度是小数点后的位数;如果为负数,则将该数的非标度值乘以 10 的负scale 次幂。因此,BigDecimal表示的数值是【unscaledValue * 10^-scale】。

JDK中对BigDecimal的定义为:不可变的、任意精度的有符号十进制数。

BigDecimal 类提供以下操作:算术、标度操作、舍入、比较、哈希算法和格式转换。toString() 方法提供 BigDecimal 的规范表示形式。

注意,BigDecimal对象是不可变的(immutable)的(像String、BigInteger一样),我们在调用其加减乘除等方法后,其实最终都返回的是一个新的BigDecimal对象,所以在做每一步运算时一定要保存操作后的值。

BigDecimal bd = BigDecimal.valueOf(0.4);

BigDecimal bd2 = BigDecimal.valueOf(0.6);

bd.add(bd2);//虽然做了加法操作,但是bd并没有保存加操作后的值

bd2 = bd.add(bd2);//bd2指向了一个新的BigDecimal对象的引用

System.out.println(bd.doubleValue() + " " + bd2.doubleValue());//0.4 1.0

System.out.println(BigDecimal.valueOf(0.4).add(BigDecimal.valueOf(0.6)));//1.0。计算时一般都会链式调用

MathContext 类

public final class MathContext extends Object implements Serializable

该对象是封装上下文设置的不可变对象,它描述数字运算符的某些规则,例如由 BigDecimal 类实现的规则。

基本独立设置为:

precision:某个操作使用的数字个数;结果舍入到此精度

roundingMode:一个 RoundingMode 对象,该对象指定舍入使用的算法。

构造方法

MathContext(int setPrecision)构造一个新的 MathContext,它具有指定的精度和 HALF_UP 舍入模式。 参数setPrecision为非负 int 精度设置。

MathContext(int setPrecision, RoundingMode setRoundingMode)构造一个新的 MathContext,它具有指定的精度和舍入模式。

MathContext(String val)根据字符串构造一个新的 MathContext。该字符串的格式必须与 toString() 方法生成的字符串的格式相同。

静态字段

static MathContext  DECIMAL128:一个 MathContext 对象,其精度设置与 IEEE 754R Decimal128 格式(即 34 个数字)匹配,舍入模式为 HALF_EVEN,这是 IEEE 754R 的默认舍入模式。

static MathContext  DECIMAL32 :一个 MathContext 对象,其精度设置与 IEEE 754R Decimal32 格式(即 7 个数字)匹配,舍入模式为 HALF_EVEN,这是 IEEE 754R 的默认舍入模式。

static MathContext  DECIMAL64 :一个 MathContext 对象,其精度设置与 IEEE 754R Decimal64 格式(即 16 个数字)匹配,舍入模式为 HALF_EVEN,这是 IEEE 754R 的默认舍入模式。

static MathContext  UNLIMITED :其设置具有无限精度算法所需值的 MathContext 对象。该设置的值为: precision=0,roundingMode=HALF_UP

PS:默认的HALF_EVEN模式不是"四舍五入"的模式,我们最好改为HALF_UP模式。

公共方法

int  getPrecision()返回 precision 设置。此值始终为非负数。

RoundingMode  getRoundingMode()返回 roundingMode 设置。它将是8种RoundingMode之一。

boolean  equals(Object x)将此 MathContext 与指定的 Object 进行相等性比较。

int  hashCode()返回此 MathContext 的哈希码。

String  toString()返回此 MathContext 的字符串表示形式。

构造方法

通过BigInteger构造BD

BigDecimal(BigInteger val)  将 BigInteger 转换为 BigDecimal。

BigDecimal(BigInteger unscaledVal, int scale)  将 BigInteger 非标度值和 int 标度转换为 BigDecimal。

【带MathContext参数--根据上下文设置进行舍入】BigDecimal(BigInteger val, MathContext mc)

BigDecimal(BigInteger unscaledVal, int scale, MathContext mc)

通过char[]构造BD

BigDecimal(char[] in)  将 BigDecimal 的字符数组表示形式转换为 BigDecimal,接受与 BigDecimal(String) 构造方法相同的字符序列。

BigDecimal(char[] in, int offset, int len)  将 BigDecimal 的字符数组表示形式转换为 BigDecimal,接受与 BigDecimal(String) 构造方法相同的字符序列,同时允许指定子数组。

【带MathContext参数--根据上下文设置进行舍入】BigDecimal(char[] in, MathContext mc)

BigDecimal(char[] in, int offset, int len, Ma

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值