【踩坑】double和BigDecimal的精度问题

news2024/11/25 15:31:45

【踩坑】double和bigdecimal的精度问题

  • 背景
    • debug尝试
  • 测试代码
    • 结果
  • 总结

背景

今天生产报了个问题,在申报和预算相同的金额的时候,后台返回超出预算。一开始以为是判断逻辑的问题,找了个数据试了下发现重现不出来。又是改数据又是找前端传参最后发现是接受参数处理的问题。

double转Bigdecimal,调用compare方法没有返回预期结果

部分代码如下

balanceFee.compareTo(new BigDecimal(amt)) >= 0

debug尝试

下面两个图是分别对100和100.6
debug如图
在这里插入图片描述
在这里插入图片描述
debug看上去都好像相同, 但是结果是, 100相同, 100.6不相同

测试代码

 public static void main(String[] args) {
        double d1 = 6.66;
        double d2 = 666.0 / 100.0;
        double d3 = Double.parseDouble("6.66");
        String s1 = "6.66";
        testDoubleBigdecimal(d1, d2,d3, s1);
    }

    private static void testDoubleBigdecimal(double d1, double d2, double d3, String s1) {
        BigDecimal bg1 = new BigDecimal(d1);
        BigDecimal bg2 = new BigDecimal(d2);
        BigDecimal bg3 = new BigDecimal(d3);
        BigDecimal bg4 = new BigDecimal(s1);
        System.out.println("double = " + bg1);
        System.out.println("double / = " + bg2);
        System.out.println("str 2 double = " + bg3);
        System.out.println("str = " + bg4);
        System.out.println("bg1.compareTo(bg2) = " + bg1.compareTo(bg2));
        System.out.println("bg1.compareTo(bg3) = " + bg1.compareTo(bg3));
        System.out.println("bg1.compareTo(bg4) = " + bg1.compareTo(bg4));
        System.out.println("bg2.compareTo(bg3) = " + bg2.compareTo(bg3));
        System.out.println("bg2.compareTo(bg4) = " + bg2.compareTo(bg4));
        System.out.println("bg3.compareTo(bg4) = " + bg3.compareTo(bg4));
    }

结果

分别用666.6和66.66测试

  • 666.6结果:

double = 666.6000000000000227373675443232059478759765625
double / = 666.6000000000000227373675443232059478759765625
str 2 double = 666.6000000000000227373675443232059478759765625
str = 666.6
bg1.compareTo(bg2) = 0
bg1.compareTo(bg3) = 0
bg1.compareTo(bg4) = 1
bg2.compareTo(bg3) = 0
bg2.compareTo(bg4) = 1
bg3.compareTo(bg4) = 1

  • 66.66结果

double = 66.659999999999996589394868351519107818603515625
double / = 66.659999999999996589394868351519107818603515625
str 2 double = 66.659999999999996589394868351519107818603515625
str = 66.66
bg1.compareTo(bg2) = 0
bg1.compareTo(bg3) = 0
bg1.compareTo(bg4) = -1
bg2.compareTo(bg3) = 0
bg2.compareTo(bg4) = -1
bg3.compareTo(bg4) = -1

总结

其实double有精度问题,这个是大家都知道的. 解决精度问题用BigDecimal也是很常见的手段, 但是这里不知道为什么controller的接口使用了double来接收.

  1. double有精度问题
  2. 使用BigDecimal最好用string来转化

最坑是在debug的时候, 由于代码是balanceFee.compareTo(new BigDecimal(amt)) >= 0
第一个balanceFee是字符串转化计算而来的,是准确的, 第二个amt是double, 在debug模式下浮窗显示的值也是精准的, 然而最重要的new BigDecimal(amt)却没有浮窗显示出值.
这样也就不难理解为什么debug的时候图上看上去是一样的值, 比较的结果却不是0了

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

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

相关文章

Pose for Everything: Towards Category-Agnostic Pose Estimation 阅读笔记

类无关姿态估计 ECCV 2022 Oral 论文链接 代码链接 其他参考 引入了一个新任务:CategoryAgnostic Pose Estimation (CAPE) 类无关姿态估计 摘要: 目前的2D姿态估计与类别耦合,例如人、动物、车辆。但很多场景需要检测未知类的姿态/关键点。…

我是如何从测试开发做到年薪50万的?

入行测开,马上就要5年了。创业公司待过,大公司也待过,工作这一路走来,一些心得,转变,职场体会,早就想写出来分享一下。这个历程包含了技术的提升,工程师的素养和对这个行业的点滴感悟…

操作系统学习笔记(Ⅳ):文件

目录 1 文件管理 1.1 初识文件管理 1.文件属性 2.文件数据组织 3.向上功能 1.2 文件逻辑结构 1.无结构文件 2.有结构文件 3.顺序文件 4.索引文件 5.索引顺序文件 1.3 文件目录 1.文件控制块 2.目录结构 3.索引结点 1.4 文件物理结构 1.连续分配 2.链接分配 …

【面试题】【ES6】let和const命令 (面试必看)

给大家推荐一个实用面试题库 1、前端面试题库 (面试必备) 推荐:★★★★★ 地址:前端面试题库 1、let命令 基本用法 用法类似于var,但是所声明的变量,只在let命令所在的代码块内有效。 let…

全国计算机三级嵌入式 - 题库 - 真题(含答案) - 未来教育 - 视频讲解 - 资料获取

全国全国计算机三级嵌入式等级考试 1. 考题大纲 历年不一样。但是换汤不换药。 2. 考试真题 历年全部考题、真题。包含全部答案。 3. 未来教育 考点、知识点、历年真题视频讲解。 4. 资料获取 在本人的博客上传资源里!!!下载不易&#xff0…

[附源码]计算机毕业设计springboot勤工俭学管理小程序

项目运行 环境配置: Jdk1.8 Tomcat7.0 Mysql HBuilderX(Webstorm也行) Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持)。 项目技术: SSM mybatis Maven Vue 等等组成,B/S模式 M…

论文投稿指南——中文核心期刊推荐(计算机技术)

>>>深度学习Tricks&#xff0c;第一时间送达<<< &#x1f680; 写在前面 &#x1f431;‍&#x1f3cd; 本期开始&#xff0c;小海带会定期推荐各专业领域的中文核心期刊及论文投稿网址&#xff0c;供大家交流参考 ~ 《中文核心期刊要目总览》——是学术界…

功率放大器主要性能指标是什么(功率放大器工作状态的分类)

电子仪器中&#xff0c;放大器末级都要带动一定的负载&#xff0c;所以末级电路不仅要求可以输出较大幅度电压&#xff0c;而且要求输出较大幅度电流&#xff0c;也就是要求放大器能够对负载输出较大的功率&#xff0c;这种测试仪器就被称为功率放大器。 功率放大器主要性能指标…

人脸检测-级联卷积

人脸检测有好多种cv都有自带 说到人脸检测&#xff0c;应该是近几年不老的话题了&#xff0c;如果要将这技术真的落实到现在产品&#xff0c;其实还有很长的路&#xff0c;不知道大家有没有发现&#xff0c;很多无人超市开始走下坡路&#xff0c;也许不仅仅是技术的原因之一吧…

idea中LeetCode无法正常使用

在风诡云谲的互联网职场中&#xff0c;随时准备好简历和刷题能力是非常必要的&#xff01;在工作时间“光明正大”刷题的神器——LeetCode插件&#xff01; 原来&#xff1a;idea 2019&#xff1b;LeetCode 6.8 目前&#xff1a;idea 2020.3&#xff1b;LeetCode 8.4 一 ide…

ARM-A架构入门基础(四)Cache

14天学习训练营导师课程&#xff1a;周贺贺《ARMv8/ARMv9架构-快速入门》 1. 定义 Cache是ARM中一块可高速访问的内存块&#xff0c;每块cache包含&#xff1a; 主要的内存地址信息&#xff1b;缓存数据。 2. Cache模型 速度方面&#xff1a;L1 cache > L2 cache > L…

从json中获取嵌套对象值(Oracle中的json_value和MySQL中的JSON_EXTRACT) 以及Oracle和MySQL处理日期语法的不同

从json中获取嵌套对象值&#xff08;Oracle中的json_value和MySQL中的JSON_EXTRACT&#xff09; 以及Oracle和MySQL处理日期语法的不同1. 从json中获取嵌套对象值1.1 Oracle 的 json_value1.2 MySQL 的 JSON_EXTRACT2. 日期问题2.1 MySQL2.1.1 获取指定日期2.1.1.1 DATE_SUB() …

高等数学(第七版)同济大学 习题10-4 (后7题)个人解答

高等数学&#xff08;第七版&#xff09;同济大学 习题10-4&#xff08;后7题&#xff09; 函数作图软件&#xff1a;Mathematica 8.设球占有闭区域Ω{(x,y,z)∣x2y2z2≤2Rz}&#xff0c;它在内部各点处的密度的大小等于该点到坐标原点的距离的平方&#xff0c;试求这球的质心…

九、Sentinel熔断与限流

Sentinel实现熔断与限流 Sentinel介绍 官网 https://github.com/alibaba/Sentinel 中文 https://github.com/alibaba/Sentinel/wiki/介绍 是什么 一句话解释&#xff0c;之前的Hystrix 能干嘛 去哪下 https://github.com/alibaba/Sentinel/releases 怎么玩 https://sp…

vue学习笔记:还不会上传文件,10分钟教会你使用input file上传文件

最近在写一个用户上传MP3文件到服务器的小案例&#xff0c;我写一个这样的界面&#xff1a; 当用户点击input的时候&#xff0c;其实这里并不是input的样式&#xff0c;而是一个div将代替了input的原生样式&#xff0c;这样比较好看一点&#xff1a; <div class"addre…

Pycharm 安装配置 pyQt5 图文操作(全)

目录前言1. 安装模块2. Pycharm 配置 pyQt52.1 配置QtDesigner2.2 配置PyUic2.3 配置pyrcc3. pyQt5界面前言 Qt是开源的GUI库&#xff0c;自带的QtDesigner 可以轻松构建界面&#xff0c;而且有非常全面的工具代码库和APIpyQt 是 Qt 库的Python版本&#xff0c;目前最新版本是…

数据库--------代数运算和关系运算

目录 传统的集合运算专门的关系运算例题1例题2关系代数的运算按运算符的不同可分为传统的集合运算和专门的关系运算两类。 传统的集合运算 并(∪): 差(-): 交(∩): 笛卡尔积():R的每一行S的矩阵 示例:

A-Level化学例题解析及练习(分子间作用力和沸点)

今日知识点&#xff1a;Intermolecular forces and boiling points 例题 Q: Nitrogen, N2, and carbon monoxide, CO, both have Mr 28. The boiling point of N2 is 77 K. The boiling point of CO is 82 K.What could be responsible for this difference in boiling point…

[附源码]计算机毕业设计JAVA校园共享单车系统

[附源码]计算机毕业设计JAVA校园共享单车系统 项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybati…