电商&金融&支付场景如何精确表示金额
禁止:
不能使用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个评论
全部评论
点击登录,快来和大家讨论吧~
表情
图片
暂无评论
内容推荐
AI应用开发中的流式输出:从协议原理到工程实战的完整指南
38
第1章 LearnWise AI项目介绍
5
Spring Boot 如何处理跨域请求(CORS):深度调研报告
3
【入职求助贴】萌新刚入职某大厂做后端开发,目前还在试用期。最近遇到一个棘手的问题,想向大家求助一下。入职不久,leader 给我派了一个任务。跟我说是0.5天就可以解决,我刚毕业入职,做了一个星期没有做出来。实现一个收集定时成功任务的案例。听起来好像不复杂,但我自己摸索着做了一整个星期,到现在还没达到预期效果。这一周我基本是“边学边做”的状态,遇到卡点也会每天主动找 leader 沟通进度和疑问。
2
#字节内推# 实习、校招、社招均有岗位
4
