争议不断:金额到底是用Long还是BigDecimal?

news2024/10/7 20:27:25

先问个问题,在开发过程中你是选择用Long还是BigDecimal来处理金额?

浮点数陷阱

为什么排除float和double

浮点数无法精确表示许多十进制数。

图片

我们希望输出0.3,但由于浮点数的表示问题,实际结果却是0.30000000000000004,这在财务计算中是要命的。

Long的利与弊

Long对于不需要小数的场景,比如计数器、库存数量等,Long是理想的选择。

精度问题

先看个例子:

图片

Long为了表示小数,通常会乘以一个固定的基数(如100或10000),然后使用Long来存储。

上面的例子看起来没有问题,but 在处理更复杂的运算时,精度问题可能会显现。

比如下面这样,当涉及到除法或需要精确的舍入时:

 

java

public class LongPrecisionIssue {
public static void main(String[] args) {
// 表示100.05元和200.10元,转换为以分为单位的整数
long amount1 = 10005;
long amount2 = 20010;

// 除法运算(错误示例)
long result = amount2 / amount1;
System.out.println("Division Result: " + result); // 输出2,实际需要更精确的小数结果

// 舍入问题(错误示例)
long partialAmount = 3333; // 表示33.33元
long incorrectRounding = partialAmount / 3;
System.out.println("Incorrect Rounding: " + (incorrectRounding / 100.0)); // 输出11.11,而实际应为11.11~(更精确的结果)
}
}

Long适用于对精度要求不高且涉及大量整数运算的场景,比如计数、库存管理等。

但在涉及金融和需要精确小数的计算中,Long就显得力不从心了。

BigDecimal的高精度世界

BigDecimal提供了任意精度的运算能力,能够精确控制舍入行为,非常适合金融计算。

图片

舍入控制

BigDecimal允许我们精确控制舍入方式,例如HALF_UP(四舍五入),这在金融计算中尤为重要。

图片

缺点

尽管BigDecimal在精度和功能上优势明显,但它在性能和使用复杂性上有所牺牲。

因为每次运算都会创建新的BigDecimal对象,无形中增加了内存开销和GC压力。

实践案例

在实际开发中,还是建议使用BigDecimal来确保金额计算的精确性。

特别是在金融和电商等对金额精度要求高的场景中,BigDecimal几乎是必选项。

以下是一个简单的银行交易系统示例,展示如何使用BigDecimal进行精确的金额计算:

图片

第三方建议

阿里巴巴开发手册是建议使用Long来存储金额的整数部分,同时在应用层进行金额的格式化和计算,这种方法适用于业务逻辑较简单的场景。

MySQL官方推荐使用DECIMAL类型来存储金额,以确保存储和计算的精度,DECIMAL类型不仅可以表示精确的小数,还可以避免浮点数表示问题。

如果你的业务场景对金额的精度要求非常高,BigDecimal是首选;

如果是对整数金额进行处理,可以考虑使用Long。

最后说一句(求关注!别白嫖!)

如果这篇文章对您有所帮助,或者有所启发的话,求一键三连:点赞、转发、在看。

关注公众号:woniuxgg,在公众号中回复:笔记  就可以获得蜗牛为你精心准备的java实战语雀笔记,回复面试、开发手册、有超赞的粉丝福利!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1816952.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Python强化学习(Reinforcement Learning, RL)库之gymnasium使用详解

概要 在强化学习(Reinforcement Learning, RL)领域中,环境(Environment)是进行算法训练和测试的关键部分。gymnasium 库是一个广泛使用的工具库,提供了多种标准化的 RL 环境,供研究人员和开发者使用。通过 gymnasium,用户可以方便地创建、管理和使用各种 RL 环境,帮助…

代码随想录算法训练营第四十三天 | 01背包问题理论基础、01背包问题滚动数组、416. 分割等和子集

背包问题其实有很多种,01背包是最基础也是最经典的,软工计科学生一定要掌握的。 01背包问题 代码随想录 视频讲解:带你学透0-1背包问题!| 关于背包问题,你不清楚的地方,这里都讲了!| 动态规划经…

如何将jpg图像添加文字并转换成无压缩的dicom图像

操作系统ubuntu 20 安装imagemagick sudo apt install imagemagick 安装dcmtk sudo apt install dcmtk 脚本如下 #!/bin/bash# Font font"/usr/share/fonts/truetype/dejavu/DejaVuSans.ttf"# Font size fontsize30# Font color fontcolor"red" conver…

《web应用技术》第十一次作业

1、验证过滤器进行权限验证的原理。 代码展示: Slf4j WebFilter(urlPatterns "/*") public class LoginCheckFilter implements Filter { Override public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) thro…

数控机床采集网关的应用-天拓四方

随着工业4.0时代的到来,智能制造成为制造业转型升级的重要方向。数控机床作为制造业的核心设备,其数据采集与监控对于提升生产效率、优化生产流程具有重要意义。本案例将介绍数控机床采集网关的应用,通过该网关实现数控机床数据的实时采集、传…

道闸系统怎么录入车牌,停车场道闸车牌输入方法有哪些?

现在智慧停车场管理系统越来越受到重视,停车场道闸系统作为其中的核心组成部分,通过车牌识别技术实现了车辆的快速、准确管理,但在道闸系统初期也存在手动需要录入车牌的工作。本文将详细介绍道闸系统录入车牌的步骤和方法,帮助管…

论文写作革新:AI如何简化你的研究流程?

不知道大家有没有发现,随着人工智能技术的快速发展,AI工具正逐渐渗透到我们日常生活的各个方面,极大地提高了我们的工作和学习效率。无论是AI写作、AI绘画、AI思维导图,还是AI幻灯片制作,这些工具已成为我们不可或缺的…

16 DTLS协议

加密解密基本概念 什么是非对称加密 什么是公钥 这个就是谁都能获得的钥匙什么是私钥 只有一个人能获得 非对称加密就是公钥上的锁,私钥才能打开,私钥上的锁公钥才能打开。比如说就是地下党接头的时候,把一个信息放在盒子里,然…

用映射对比ab俩个数组 , 并把a的参数传递给b

项目背景 : react ant 需求 : 在项目进行表头设置时,根据aaa中的key和bbb中的name对应 , 并将sort值插入到bbb中 其中 a b 结构如下 具体实现 aaa[ { key: "orderNumber", orderNumber: "工单编号", sort: 1 } ... ]bbb [ { name: "orderNumber…

白酒:茅台镇白酒的消费趋势与未来发展

茅台镇,中国白酒的璀璨明珠,以出产品质的白酒而享誉全球。在这片神奇的土地上,云仓酒庄豪迈白酒以其别具一格的酿造工艺和风格特点,成为了市场的宠儿。随着消费市场的不断变化,云仓酒庄豪迈白酒的消费趋势也在悄然发生…

有哪些指标体系搭建模型?五个步骤教你从0开始搭建指标体系

在当今的商业环境中,数据驱动决策已成为企业成功的关键因素。构建一个有效的指标体系是实现数据驱动的基石,它能够帮助企业明确业务目标、量化业绩表现、监控市场动态,并指导战略规划。一个精心设计的指标体系能够为企业提供一个全面的视图&a…

凡尔码来访登记卡助力来访安全

来访登记制度是指为了加强对来访人员的管理和安全控制,确保组织内部秩序和安全的一项制度。通过来访登记制度,可以对来访人员的身份进行核实,了解来访目的,并采取相应的安全措施,为组织内部的工作和人员安全提供保障。…

【Qt 学习笔记】Qt窗口 | 对话框 | 创建自定义对话框

博客主页:Duck Bro 博客主页系列专栏:Qt 专栏关注博主,后期持续更新系列文章如果有错误感谢请大家批评指出,及时修改感谢大家点赞👍收藏⭐评论✍ Qt窗口 | 对话框 | 创建自定义对话框 文章编号:Qt 学习笔记…

为什么代理IP都没有100%可用性?

在当今高度互联的网络环境中,代理IP已成为许多网络活动的重要支撑工具,从数据收集到业务推广,无所不包。然而,代理IP在很多场景中发挥着重要作用,却很难实现100%的可用性。 这种情况并非偶然,而是受到多重复…

【Qt 学习笔记】Qt窗口 | 标准对话框 | 字体对话框QFontDialog

博客主页:Duck Bro 博客主页系列专栏:Qt 专栏关注博主,后期持续更新系列文章如果有错误感谢请大家批评指出,及时修改感谢大家点赞👍收藏⭐评论✍ Qt窗口 | 标准对话框 | 字体对话框QFontDialog 文章编号:Q…

IEOSE 2024北京国际教育留学海外院校展览会11月举办

IEOSE 2024北京国际教育留学展览会 IEOSE 2024 Beijing International Education and Overseas Study Exhibition 2024年11月15日-11月17日(周五-周日) 15th-17th November, 2024 北京国家会议中心 China National Convention Ce…

C# WPF 读写CAN数据

C# WPF 读写CAN数据 CAN 分析仪 分析仪资料下载 官方地址:https://www.zhcxgd.com/1.html CSDN: 项目配置 复制Dll库文件 文件在上面的资料里面 设置不安全代码 CAN C#工具类 CAN_Tool.cs using Microsoft.VisualBasic; using System; using Sys…

ASM-MehotdVisitor实践

使用ASM几乎用户全部的精力都是对MethodVisitor的处理,方法code的处理都需要使用这个类进行操作。还是之前文章说过的,ASM单独学习意义并不大,难以达到触类旁通,先行掌握字节码基础后再玩起ASM才能体会真正的乐趣,不然…

【Python】已解决TypeError: unsupported operand type(s) for ...报错方案合集

😎 作者介绍:我是程序员洲洲,一个热爱写作的非著名程序员。CSDN全栈优质领域创作者、华为云博客社区云享专家、阿里云博客社区专家博主。 🤓 同时欢迎大家关注其他专栏,我将分享Web前后端开发、人工智能、机器学习、深…

【Python】selenium 点击某个按钮 click() 出现的报错问题--ElementClickInterceptedException(全!)

写在前面: 我们在使用selenium 点击某个元素时或者获取find_element的某个网页元素时,总会遇到一些问题。本人经验是,最直接的方法是用try_except 报错,直接绕过问题,可以直接看第一条。如果有兴趣具体解决&#xff0c…