Java中使用什么数据类型来存储与金钱相关的数据类型?

今天看到这么一道面试题:存储金钱用什么数据类型?

我的第一反应是很简单,使用float 或者double就可以了啊,而我们平常在练习或者在小公司的开发中也是这么用的。但是搜索了一下,发现这样是错误的做法,float、double数据类型在计算的时候会导致精度丢失,虽然其结果与真实值的误差可能是接近于0,但是在银行、财务相关的系统开发中,设计到的数据量很大,计算结果准确度要求极高的业务场景中,使用float、double必然会导致很大的误差和损失。

1. 正确做法:使用 BigDecimal

  • Java语言提供了另外一种数据类型 BigDecimal可以表示精确的浮点数,适合用作财务计算的数据类型。

  • 但是需要注意的是,在使用BigDecimal的时候,BigDecimal有多个重载的构造方法能表示精度的值,只有用参数为String类型的构造方法才能表示

举例:
在这里插入图片描述
用参数Double构造出来的BigDecimal运算值失去精度,应该是跟参数为Double有关的。

其实BigDecimal更像一个工具类,加减乘除的都有自己的函数,有兴趣的你可以自己再自己深入研究一下。

2. 加减乘除

在这里插入图片描述

3. 大小比较

在这里插入图片描述

4. 小数位数及四舍五入规则

在项目中,涉及到税费的计算,计算的结果可能是小数点后面十几位,那么怎么进行结算呢?这就需要四舍五入。

其中setScale的第一个参数是小数位数, 这个示例是保留2位小数, 后面是四舍五入规则。
在这里插入图片描述

5. mysql数据库设计

BigDecimal在进行入库时,数据库选择decimal类型, 长度可以自定义, 如18; 小数点我们项目中用的是2,保留2位小数。 此外还要注意的就是默认值, 一定写成0.00, 不要用默认的NULL,否则在进行加减排序等操作时,会带来转换的麻烦!

`balance` decimal(18,2) DEFAULT '0.00' COMMENT '账户余额'
  • 5
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值