java实际开发——涉及金额时使用的数据类型BigDecimal

目录

首先说结论,使用 BigDecimal 类。

为什么不用其它的类型?(比如int、long、float、double)

1、整型:

2、浮点型:

BigDecimal类

基本数据类型与BigDecimal使用时的差别:

1、创建

2、+ - * /

3、比较

标度(Scale)

舍入模式

数据库


首先说结论,使用 BigDecimal 类。

为什么不用其它的类型?(比如int、long、float、double)

1、整型:

        int、long类型不能够表示小数部分,不符合金额的实际应用。

2、浮点型:

        float、double会有精度丢失,不推荐用于金额。

如下:      0.06 - 0.01 结果应该是0.05

float f1 = 0.01f;
float f2 = 0.06f;//float类型加f后缀(必须),double类型加d后缀(可无)
System.out.println(f2-f1);

double d1 = 0.01;
double d2 = 0.06;
System.out.println(d2-d1);

到这,我们已知这些基本的数据类型无法满足我们的需求,下面介绍一个类——BigDecimal

BigDecimal类

基本数据类型与BigDecimal使用时的差别:

1、创建

这是一个类,所以我们在创建时不是简单的赋值,而是需要new()对象。

(一定要注意,这里是需要用字符串 "0.01" 和字符串 "0.02" 创建,而不能用 0.01 和 0.02 创建。这是因为在使用 0.01 创建时是使用浮点数创建,浮点数的创建会产生误差,这个误差会被保存到了BigDecimal对象中。)

BigDecimal b1 = new BigDecimal("0.01");
BigDecimal b2 = new BigDecimal("0.02");
2、+ - * /

在运算时,也不能用 + - * / 等运算符,而是需要运用相对应的方法。

b2.add(b1);         //b2 + b1
b2.subtract(b1);    //b2 - b1
b2.multiply(b1);    //b2 * b1
b2.divide(b1);      //b2 / b1
3、比较

b2.compareTo(b1): 比较当前 BigDecimal 对象b1与b2的大小。
b2.equals(b1): 检查当前 BigDecimal 是否与指定的对象相等(包括标度)。

标度(Scale)

BigDecimal 有一个标度属性,表示小数点后的位数。标度的设置会影响值的精度。例如,new BigDecimal("1.2345") 的标度是4。

在进行计算时,如果没有适当设置标度,可能会导致精度损失或抛出异常(如在使用 divide() 方法时)


舍入模式

在某些操作(如除法)中,BigDecimal 需要指定舍入模式,以避免精度丢失。

常用的舍入模式包括:

进位:RoundingMode.UP                         ( 0.055 —> 0.06)

舍去后面的位数:RoundingMode.DOWN ( 0.055 —> 0.05)

四舍五入:RoundingMode.HALF_UP       (向上,0.055 —> 0.06)

四舍五入:RoundingMode.HALF_DOWN(向下,0.055 —> 0.05)

数据库

java实际开发——数据库存储金额时用什么数据类型?(MySQL、PostgreSQL)-CSDN博客

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值