java项目中与金额有关的计算注意事项

java项目中与金额有关的计算注意事项

前言:

在项目中,财务相关的数据计算可能会通过项目进行各种计算以及存库,本篇讲述这个过程中的注意事项。

1.浮点型的误差

浮点型由于其定义的原因,在使用的时候总会存在误差,以下以pgsql为例:

select 0.1::float+0.2::float; -- 返回结果:0.30000000000000004

可以看到这就出现了误差,尾数末尾有个4,在计算中进行比较的时候可能就会出现错误,比如0.1+0.2 > 0.3了。

所以在项目中与金额有关的计算全部避免使用浮点型,像java中的double,float以及对应的封装类,pgsql中的float等,均避免使用。

2.数据库中如何存储

第一小节讲述了浮点型可能造成的误差,那么数据库中应该如何存储呢,以pgsql为例,应当使用decimal或者numeric存储,这种类型的固定精度和标度的数值可以避免浮点数误差导致的问题。

3.java中如何避免浮点精度问题

java中有一个BigDecimal类,与pgsql中decimal和numeric类似,都是固定精度和标度的数值,都不会有浮点型的误差,但是需要注意的是,在使用的时候不能使用Double接收了前端参数之后,再由这个double类型初始化BigDecimal,从前端接受和后端取库中数据以及计算,应当全程使用BigDecimal,避免中间任意一环使用浮点数。

4.其他案例

在避免了浮点数精度导致的问题的时候,金额计算可能会伴随着其他问题,下面进行举例:

以一个简单的奖金计算为例,一个项目有若干个里程碑,每个里程碑有对应的进度,里程碑达成后,会生成里程碑进度×项目金额的奖金,由于金额的最小单位是分,所以数据库中存储保留两位小数并且去除多余尾数的时候向下取整。假设项目金额10000.57,有两个里程碑,第一个里程碑进度33%,第二个里程碑进度67%,总和为100%。

当第一个里程碑达成的时候,获得的奖金为10000.57×0.33=3,300.1881,保留两位小数后获得结果3,300.18,第二个里程碑达成后获取奖金10000.57×0.67=6,700.3819,保留两位小数取得结果6700.38,两次奖金相加3300.18+6700.38=10000.56,总的奖金生成少了1分钱,这一分钱看似无所谓,财务计算的时候能要命。

  • 那么应该如何避免呢?
    • 首先这个问题是怎么造成的呢?这个问题是因为进行了保留小数的操作,造成的,那么就有两种方案:
      • 不舍去多余小数。(但是如果一定要舍去的情况咋办呢qwq,其实讲这个案例就是为了说明保留小数位数后造成最后总金额算出来不对)
      • 在某个环节补回来,上面这个案例就可以在最后一个里程碑达成之后,和总奖金进行计算,将误差的金额补回来。

5.总结

  • 数据库存储金额的时候避免使用浮点数,以pgsql为例,使用numeric或者decimal。
  • java中避免浮点数精度问题的时候,从接受前端数据到后端存库以及中间计算,全程使用BigDecimal接受前端参数和进行运算以及存库。
  • 金额相关的计算都应该慎重考虑,不止浮点数造成的误差,保留小数位数的操作可能也会造成误差,需要在某些环节补回来。
    最后欢迎各位大佬批评指正QWQ

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

今日早报 每日精选15条新闻简报 每天一分钟 知晓天下事 6月30日,星期日

每天一分钟,知晓天下事! 2024年6月30日 星期日 农历五月廿五 1、 气象台继续发布暴雨红色预警:30日,安徽、湖南等地局地有特大暴雨。 2、 稀土管理条例公布:任何组织和个人不得侵占或者破坏稀土资源。 3、 暑期全国将…

ubuntu丢失网络/网卡的一种原因解决方案

现象 开机进入ubuntu后发现没有网络,无论是在桌面顶部状态栏的快捷键 还是 系统设置中,都没有”有线网“和”无线网“的选项,”代理“的选项是有的使用数据线连接电脑和手机,手机开启”通过usb共享网络“,还是没有任何…

Parzen 窗估计法

本篇文章是博主在人工智能等领域学习时,用于个人学习、研究或者欣赏使用,并基于博主对人工智能等领域的一些理解而记录的学习摘录和笔记,若有不当和侵权之处,指出后将会立即改正,还望谅解。文章分类在AI学习笔记&#…

一文弄懂逻辑回归算法

1. 引言 今天我们将深入探讨另一种基本的机器学习算法:逻辑回归。在前两篇文章中,我们使用线性回归和梯度下降法帮助我们的朋友马克确定了他 2400 平方英尺房子的理想售价。 最近马克再次向我们求助。他住在一个高档社区,他认为低于一定面积…

docker pull 镜像的时候遇到Pulling fs layer问题

最近遇到一个很奇怪的问题,docker pull 镜像的时候,总是出现Pulling fs layer问题,导致镜像拉取不成功,以前是安装好docker,正常拉取镜像都是没什么问题的,在这里记录一下这个问题的解决方法,当然,可能并不通用。 1、进入阿里云容器服务 地址:https://cr.console.aliy…

宝藏网站推荐,这些网站不可不知

在如今网络信息爆炸的时代,想要在众多网站中查找筛选一些好用的宝藏网站不是一件容易的事情。下面小编就来和大家分享几个值得推荐的宝藏网站,可以极大的提高大家上网效率,涵盖办公,学习,生活各个方面。 一、b站 b站…

IDEA中导入Maven项目

相关内容: Maven的安装与配置 在IDEA中配置Maven环境 在IDEA中创建Maven项目 IDEA中Maven配置依赖和排除依赖 IDEA中导入Maven项目 方式1:使用Maven面板,快速导入项目 打开IDEA,选择右侧Maven面板,点击 号&…

基于DSMM数据安全能力建设方案的落地性评估指标

写在前面: 随着信息技术的迅猛发展,数据已成为企业最宝贵的资产之一。然而,数据安全问题也随之而来,如何确保数据的安全性、完整性和可用性,已成为企业面临的重要挑战。DSMM(数据安全能力成熟度模型&#x…

路径规划 | 基于蜣螂优化算法的栅格地图机器人路径规划(Matlab)

目录 效果一览基本介绍程序设计参考文献 效果一览 基本介绍 路径规划 | 基于蜣螂优化算法的栅格地图机器人路径规划(Matlab) 1.利用蜣螂算法DBO优化栅格地图机器人路径规划,效果如图所示,包括迭代曲线图、栅格地图等等&#xff5e…

知识不成体系?这篇Mysql数据库将成为你的解忧杂货店!(Mysql用户管理)

欢迎来到一夜看尽长安花 博客,您的点赞和收藏是我持续发文的动力 对于文章中出现的任何错误请大家批评指出,一定及时修改。有任何想要讨论的问题可联系我:3329759426qq.com 。发布文章的风格因专栏而异,均自成体系,不足…

【鸿蒙学习笔记】尺寸设置

官方文档:尺寸设置 目录标题 width:设置组件自身的宽度,缺省时自适应height:设置组件自身的高度,缺省时自适应size:设置高宽尺寸。margin:设置组件的外边距padding:设置组件的内边距…

LeetCode题练习与总结:环形链表Ⅱ--142

一、题目描述 给定一个链表的头节点 head ,返回链表开始入环的第一个节点。 如果链表无环,则返回 null。 如果链表中有某个节点,可以通过连续跟踪 next 指针再次到达,则链表中存在环。 为了表示给定链表中的环,评测…

【鸿蒙学习笔记】位置设置

官方文档:位置设置 目录标题 align:子元素的对齐方式direction:官方文档没懂,看图理解吧 align:子元素的对齐方式 Stack() {Text(TopStart)}.width(90%).height(50).backgroundColor(0xFFE4C4).align(Alignment.TopS…

数据分析的线上云端数据库搭建及Excel和Tableau连接

数据分析的线上云端数据库搭建及Excel和Tableau连接 SQL基础知识 线上SQL训练: SQlZOO: https://www.sqlzoo.net/wiki/SQL_Tutorial 牛客网SQL真题:https://www.nowcoder.com/ta/sql select,from,where, order by, limit, group by, having, substr(),…

windows 本地ES 7.11.0 版本集群搭建

1.先下载JDK ,建议下载JDK11. 2.下载ES Windows安装包 7.11.0下载 3.下载完成后,在本地解压三份,分别取名 node1,node2,node3 4.若启动一直报端口占用,这修改 每个文件夹下bin/elasticsearch.bat文件,没有则跳过 在…

MySQL高级-MVCC- readview介绍

文章目录 1、介绍2、ReadView中包含了四个核心字段:3、版本链数据的访问规则:4、不同的隔离级别,生成ReadView的时机不同: 1、介绍 ReadView(读视图)是 快照读 SQL执行时MVCC提取数据的依据,记录…

基于bootstrap的12种登录注册页面模板

基于bootstrap的12种登录注册页面模板,分三种类型,默认简单的登录和注册,带背景图片的登录和注册,支持弹窗的登录和注册页面html下载。 微信扫码下载

[Redis]主从模式

启动主从复制 由于我们只有一台机器,所以我们只能在机器上开多个redis程序来演示不同的机器 因为一个端口号只能被一个进程绑定,所以我们需要修改配置,绑定不同的端口号,并且还要修改工作目录(数据持久化的位置&#…

第二天:ALOAM前端讲解【第1部分】

第二天:ALOAM前端讲解 目标: 熟悉 ALOAM基本原理与代码框架,快速熟悉代码ALOAM效果 内容: LOAM论文论文精讲整体代码框架介绍前端特征提取,点到线、点到面ICP代码讲解ALOAM精讲 一、ALOAM整体架构 LOAM主要包含两个模块,一个是Lidar Odometry,即使用激光雷达做里程计计…

Qt项目天气预报(8) - 绘制温度曲线 + 回车搜索(最终篇)

全部内容在专栏: Qt项目 天气预报_mx_jun的博客-CSDN博客 目录 绘制温度曲线 事件过滤器在子控件上绘图 子控件下载事件过滤器 事件过滤器进行绘图 - eventFilter 画初步高温曲线 画初步低温曲线 效果演示 画低温曲线 画高温曲线 效果演示 按下回车搜索: …