电商&金融&支付场景如何精确表示金额

禁止:

不能使用Float和Double来表示金额,会存在精度丢失的问题

推荐:两种都可以使用

1、long:

单位为分,数据库存bigint,代码中用long

long 是 Java 的一种基本数据类型,用于表示没有小数部分的整数。他的基本数据类型,所以速度要快一些,但是因为他无法表示小数,所以如果金额中出现比更小的单位,就会丢失精度。所以,Long的适用场景是适合于不涉及小数计算的大整数运算,如某些计数应用或者金额以整数形式表示。比如我们的额度系统、积分系统等。

2、BigDecimal:

单位为元,数据库用decimal,代码中用BigDecimal

BigDecimal 是 Java 中用于精确计算的类,他的好处就是精确度高,支持灵活的数学计算,能自己控制舍入行为,所以,BigDecimal的适用场景是需要高精度计算的金融应用,如货币计算、利率计算等。

BigDecimal的坑:

1. 比较两个数不要使用equals()方法:

比如1.0和1两个数比较值的话,如果使用了BigDecimal的equals()方法进行比较的话,那么得到的结果将会是false,因为BigDecimal的equals()方法不光比较两个数的值是否相等,还会比较精度是否相等。

值的对比需要用 compareTo 方法

2. 不要使用double和float创建BigDecimal:

因为double和float本来就是精度不准确的类型,那么创建出来的BigDecimal也会是不准确的数字,需要使用字符串类型去创建BigDecimal对象,这样就不会存在精度丢失的问题了

3. 转成字符串:

转成字符串时不要使用toString()方法,而要使用toPlainString()方法。

因为toString()方法对于一些极大或极小的数,可能会将这些数字转成科学计数法的形式输出出来

而toPlainString()方法则始终不会转成科学计数法的形式进行表示

0个评论
点击登录,快来和大家讨论吧~
表情
图片
暂无评论
航
下载 APP