争论不休的一个话题:金额到底是用Long还是BigDecimal?

这篇具有很好参考价值的文章主要介绍了争论不休的一个话题:金额到底是用Long还是BigDecimal?。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

在网上一直流传着一个争论不休的话题:金额到底是用Long还是用BigDecimal?这个话题一出在哪都会引起异常无比激烈的讨论。。。。
比如说这个观点:算钱用BigDecimal是常识

有支持用Long的,将金额的单位设计为分,然后乘以100,使用Long进行存储以及计算,这样不用担心小数点问题。

并且一些银行系统就会选择用Long

还有,最最最牛逼的万能大法:用String


成年人不做选择题,Long跟BigDecimal都用。。。

还有一种就是封装一个金额的基类,对金额进行统一处理。

排除float和double

当然,对于金额,首先我们要排除的就是float和double。它们不适合用于精确的金融计算,因为floatdouble是基于IEEE 754标准的浮点数表示,它们无法精确地表示所有的十进制小数。这会导致在进行财务计算时出现舍入误差,这些误差可能会累积并导致不可预测的结果。

关于带精度的计算,我们不推荐使用float以及double,推荐使用BigDecimal,具体原因请参考:聊一聊_BigDecimal_使用时的陷阱

选择Long

Long类型在Java中用于存储64位整数。它的主要优点是速度快,因为整数运算在CPU层面是非常高效的。另外,Long类型也占用较少的内存,并且整数类型(BIGINT)在数据库中占用较少的存储空间。

但是Long类型在处理金额时有几个明显的缺点:

  1. 精度问题Long只能存储整数,无法直接表示小数。使用Long来表示以分为单位的金额(例如,100表示1元),此时就会失去小数的精度。即使使用某种方式来表示小数(例如,乘以100或10000),也会遇到舍入误差的问题。并且这种计算方式也会增加计算的复杂度。
  2. 浮点数问题:虽然这不是直接使用Long的问题,但如果你尝试将Long与浮点数(如doublefloat)进行转换以进行计算(比如汇率计算等),还是会遇到浮点数精度问题,这可能导致在财务计算中出现不可接受的误差。

在阿里巴巴的开发手册中建议使用Long。

但是在一些金融系统当中,对小数位要求比较高的,比如精确到小数点后6位,那么我们使用Long进行存储,每次在计算时都要除以或者乘以1000000,那么计算的开销就很大了。

并且,如果在需求确认时,我们无法知道金额要求的小数位,那我们使用Long也是不行的,我们并不知道需要乘以或者除以多少个0。

选择BigDecimal

BigDecimal是Java提供的一个类,用于任意精度的算术运算。它的主要优点是提供了高精度的计算,这对于金融和货币计算来说是非常重要的。BigDecimal可以表示任意大小的正数、负数或零,并可以精确控制舍入行为。并且在数据库中存储时也有对应的类型进行匹配,比如MySQL的DECIMAL类型提供了精确的数值存储,可以匹配BigDecimal的精度。

但是BigDecimal也有一些缺点:

  1. 性能:与Long相比,BigDecimal的性能较差。因为它的运算需要更多的内存和CPU时间。
  2. 复杂性:使用BigDecimal进行运算比使用Long或基本数据类型更复杂。你需要考虑舍入模式、精度等因素。
  3. 在数据库中需要更多的存储空间来存储小数部分。

而在Mysql的开发手册中,建议金额需要进行小数位计算时,存储要使用Decimal,否则我们要将金额乘以对应小数位的倍数变成BIGINT进行存储。

总结

基于上述对LongBigDecimal的优缺点分析,我们可以得出以下结论:

在金额计算层面,即代码实现中,推荐使用BigDecimal进行所有与金额相关的计算。BigDecimal提供了高精度的数值运算,能够确保金额计算的精确性,避免了因浮点数精度问题导致的财务误差。使用BigDecimal可以简化代码逻辑,减少因处理精度问题而引入的复杂性。

而在数据库存储方面,我们需要根据具体需求进行权衡。如果业务需求已经明确金额只需精确到分(如某些国家/地区的货币最小单位为分),并且我们确信不会涉及到需要更高精度的小数计算,那么可以使用Long类型进行存储,将金额转换为最小货币单位(如分)进行存储。这样可以节省存储空间并提高查询性能。

但是如果业务需求中金额的小数位数不确定,或者可能涉及多位小数的计算(如国际货币交易等),那么最好使用DECIMALNUMERIC类型进行存储。这些类型提供了精确的数值存储,可以确保数据库中的数据与应用程序中的BigDecimal对象保持一致,避免数据转换过程中可能引入的精度损失。

本文已收录于我的个人博客:码农Academy的博客,专注分享Java技术干货,包括Java基础、Spring Boot、Spring Cloud、Mysql、Redis、Elasticsearch、中间件、架构设计、面试题、程序员攻略等文章来源地址https://www.toymoban.com/news/detail-855017.html

到了这里,关于争论不休的一个话题:金额到底是用Long还是BigDecimal?的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • chatgpt赋能python:Python到底是一个SEO友好的选择吗?

    随着Python成为越来越受欢迎的编程语言,人们开始担心它是否适用于SEO。因为SEO是一项关键性能指标,因此希望了解Python是否确实是适用于这一目标。 首先,Python确实具有一些SEO优点。它可以影响网站的速度和性能,从而提高搜索引擎的排名。Python还可以使开发人员更容易地

    2024年02月07日
    浏览(44)
  • 一个操作让数组处理速度快了5倍,到底是为什么

      概述: 通过对数组进行排序,代码更好地利用了缓存,从而提高了程序的性能。这种现象通常被称为\\\"缓存友好\\\"(cache-friendly)或\\\"空间局部性\\\"(spatial locality) 今天做一个数组数据计算时,发现一个效率问题,给大家分享一下 一个数组排序和不排序时同样的逻辑处理速度是

    2024年03月24日
    浏览(58)
  • windows11 这个男神到底值得用吗?——一个男神的传奇

    hihihi,我总算开始更新了!这一天(11/21),正好我在家里上课,所以我来了兴致,给大家讲讲windows11,这个男神的传奇! Windows 11是由微软公司(Microsoft)开发的操作系统,应用于计算机和平板电脑等设备。于2021年6月24日发布,2021年10月5日发行。 Windows 11提供了许多创新功

    2024年02月09日
    浏览(43)
  • python做了一个极简的栅格地图行走机器人,到底能干啥?

    在现代科技的普及下,人们对于机器人的兴趣与期待日渐增加。然而,大多数人对机器人的印象仍停留在复杂、高度智能的形象上。而今天,我将重点介绍一个极简的栅格地图行走机器人,它不仅使用了简单的编程语言Python,而且只是一个基础的栅格地图行走算法的展示。这

    2024年02月20日
    浏览(43)
  • 华为系统底层是用Java写的吗?和安卓的区别?

    HarmonyOS(鸿蒙操作系统)是华为自主开发的分布式操作系统。下面是对HarmonyOS底层的详细介绍: 微内核架构:HarmonyOS采用了微内核架构,将核心服务和功能放在微内核中,而将其他应用服务放在用户空间中。这种架构有助于实现模块化开发和系统的高度可扩展性。 分布式能

    2024年01月21日
    浏览(41)
  • jquery 数字金额转化为大写金额

    示例:money:100 转化为 壹佰元整 //大写金额元币 function DaXieJinE(money) {     // 汉字的数字     var cnNums = new Array(\\\'零\\\', \\\'壹\\\', \\\'贰\\\', \\\'叁\\\', \\\'肆\\\', \\\'伍\\\', \\\'陆\\\', \\\'柒\\\', \\\'捌\\\', \\\'玖\\\');     // 基本单位     var cnIntRadice = new Array(\\\'\\\', \\\'拾\\\', \\\'佰\\\', \\\'仟\\\');     // 对应整数部分扩展单位     var cnIn

    2024年04月12日
    浏览(37)
  • js将数字金额转换成中文金额格式

    在开发中我们经常会遇到处理数字的问题,下面介绍一种处理数字金额转换为中文金额的方式: 我们通常使用三种书面数字系统:全球使用的阿拉伯数字系统和两种本地数字系统(繁体、简体)。常规时我们使用阿拉伯数字(1,2,3等),但在某些情况中,如金融中我们会使

    2024年02月16日
    浏览(38)
  • 开发跨平台APP,是用Flutter还是React Native开发框架?

     随着移动互联网的飞速发展,对于开发人员而言,如何快速地开发出兼容不同平台(iOS、Android)的应用,成为了一个重要的问题。 跨平台应用程序开发框架的好处: 1. 一个App适用于多个设备; 2. 一个App适用于多个平台; 3. 一个App可以在多个应用商店中发布; 4. 只需编写

    2024年02月15日
    浏览(77)
  • Python潮流周刊#10:Twitter 的强敌 Threads 是用 Python 开发的!

    你好,我是猫哥。这里每周分享优质的 Python 及通用技术内容,大部分为英文,已在小标题注明。(标题取自其中一则分享,不代表全部内容都是该主题,特此声明。) 首发于我的博客:https://pythoncat.top/posts/2023-07-08-weekly 周刊已开通 Telegram 频道 ,欢迎关注:https://t.me/pytho

    2024年02月13日
    浏览(63)
  • 10款最好用的代码编辑器 你是用哪种登录酷游?

    你是学习程式语言的初学者吗? 本文由酷游登录网址AP98点NEㄒ原创,未经许可请勿转发。可能刚学会第一门代码语言,或是厌倦了当前的代码编辑器,想改换一款介面美观又好用? 以下将整理5款我们认为好用的代码编辑器,也欢迎各位分享自己正在使用的咯~ 1.Visual Studi

    2024年02月09日
    浏览(47)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包