浮点数之间的等值判断,基本数据类型不能用==来比较,包装数据类型不能用equals来判断。

说明:浮点数采用“尾数+阶码”的编码方式,类似于科学计数法的“有效数字+指数”的表示方式。

二进制无法精确表示大部分的十进制小数,具体原理参考《码出高效》。

源代码

     double maxValue = 0.0;
double minValue = 0.0;
for (Map<String, Object> map : list) {
if (!"-".equals(map.get(SignData.VALUE).toString())) {
if (maxValue == 0.0) {
maxValue = Double.parseDouble(map.get(SignData.VALUE).toString());
minValue = Double.parseDouble(map.get(SignData.VALUE).toString());
continue;
}
if (maxValue < Double.parseDouble(map.get(SignData.VALUE).toString())) {
maxValue = Double.parseDouble(map.get(SignData.VALUE).toString());
}
if (minValue > Double.parseDouble(map.get(SignData.VALUE).toString())) {
minValue = Double.parseDouble(map.get(SignData.VALUE).toString());
}
}
}

修改完后

     double maxValue = 0.0;
double minValue = 0.0;
for (Map<String, Object> map : list) {
if (!"-".equals(map.get(SignData.VALUE).toString())) {
if (BigDecimal.valueOf(maxValue).compareTo(new BigDecimal("0.0")) == 0) {
maxValue = Double.parseDouble(map.get(SignData.VALUE).toString());
minValue = Double.parseDouble(map.get(SignData.VALUE).toString());
continue;
}
if (maxValue < Double.parseDouble(map.get(SignData.VALUE).toString())) {
maxValue = Double.parseDouble(map.get(SignData.VALUE).toString());
}
if (minValue > Double.parseDouble(map.get(SignData.VALUE).toString())) {
minValue = Double.parseDouble(map.get(SignData.VALUE).toString());
}
}
}

知识点补充

BigDecimal 使用compareTo比较大小

1.BigDecimal的比较模式

BigDecimal b1 = new BigDecimal(0.1);
BigDecimal b2 = new BigDecimal(0.2);
int c = b1.compareTo(b2); // -1 c=1表示b1大于b2
c=0表示b1等于b2
c=-1表示b1小于b2

2.BigDecimal的round模式

BigDecimal.ROUND_UP
无条件进1,1.01 ->1.1
BigDecimal.ROUND_DOWN
无条件舍弃,1.09 -> 1.0
BigDecimal.ROUND_HALF_UP
四舍五入
BigDecimal.ROUND_HALF_DOWN
五舍六入,即舍弃部分大于等于6才会进1
BigDecimal.ROUND_CEILING
向正无穷方向舍弃,1.01 -> 1.1
BigDecimal.ROUND_FLOOR
向负无穷方向舍弃,1.09 -> 1.0
BigDecimal.ROUND_HALF_EVEN
当舍弃部分的左边是奇数时,表现同ROUND_HALF_UP(四舍五入)
当舍弃部分的左边是偶数时,表现同ROUND_HALF_DOWN(五舍六入)
BigDecimal.ROUND_UNNECESSARY
Assert操作,证明计算是准确的,不需要round
System.out.println(new BigDecimal(1.25).setScale(1, BigDecimal.ROUND_HALF_UP).setScale(1, BigDecimal.ROUND_UNNECESSARY));

问题总结:浮点数之间的等值判断,基本数据类型不能用==来比较,包装数据类型不能用equals来判断的更多相关文章

  1. C#中的等值判断1

    目录 简介 值类型和引用类型的相等比较 和相等比较相关的函数 string 和 System.Uri 的等值比较 泛型接口 IEquatable<T> 自定义比较方法 举例 总结 简介 最 ...

  2. python 分支语句 等值判断 逻辑运算符

    # 分支语句age = 233if age < 18: print('您还未满18岁,禁止入内')elif age > 18 and age < 60: print("欢迎 ...

  3. C# 值类型和引用类型等值判断

    using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.T ...

  4. (IEEE-754) 字节数组与浮点数之间的互相转换(MODBUS float类型)

    在做上位机开发过程中,经常会碰到字节数组与浮点数,整数等数据之间的转换,有时为了验证数据是否解析正确,得借助于IEEE浮点数工具,本文把基于c#实现的浮点数与字节数组(或16进制的字符串)转换的实现方 ...

  5. JS进制转换,浮点数相加,数字判断

    document.write("整数转换函数:parseInt(数据,底数)<br>"); document.write("10101=>" ...

  6. switch结构可以更好的解决等值判断问题

    switch 选择结构的语法:switch (表达式){case 常量 1://代码块1:break;case 常量 2://代码块2:break;......default://代码块n:break ...

  7. innodb锁之间的兼容性判断

    检查锁与锁之间的兼容性 路径:/mysql-5.5.43/storage/innobase/lock/lock0lock.c 实现:见锁的强度比较  row 可理解为 lock 的锁模式  colum ...

  8. PHP等值判断中,常量与变量在左在右的区别

    在平时写代码过程中,经常会用到判断变量与常量相等的情况,比如if($a==1){…..} 或者if(1==$a) ,从执行效率上来说,1==$a比 $a==1的效率更高. 这个写法的另一个好处,当使用 ...

  9. java学习之switch 等值判断

    当匹配到相等的值时候 则进入case里面执行语句 当该语句有break时候 则退出匹配 当没有break时候 则继续往下匹配 直到遇到break才停止匹配

  10. C++ 浮点数 为 0 的判断

随机推荐

  1. JS加载机制

    做开发多年后发现自己思维任然只定位在功能的实现:忽略了很多代码最终的实现,加载机制等 那我们接下来就借助几篇博客来理理天天看见的js:理理他究竟是怎么过执行的 一.代码检测 首先浏览器会对所有js 进 ...

  2. ODOO13 之十 :Odoo 13开发之后台视图 – 设计用户界面

    Odoo 13开发之后台视图 – 设计用户界面 本文将学习如何为用户创建图形化界面来与图书应用交互.我们将了解不同视图类型和小组件(widgets)之间的差别,以及如何使用它们来提供更优的用户体验. ...

  3. R 语言绘制环状热图

    作者:佳名来源:简书 - R 语言文集 1. 读取并处理基因表达数据 这是我的基因表达量数据: 图 Fig 1 > myfiles <- list.files(pattern = &quo ...

  4. 深度学习应用篇-计算机视觉-图像分类[2]:LeNet、AlexNet、VGG、GoogleNet、DarkNet模型结构、实现、模型特点详细介绍

    深度学习应用篇-计算机视觉-图像分类[2]:LeNet.AlexNet.VGG.GoogleNet.DarkNet模型结构.实现.模型特点详细介绍 1.LeNet(1998) LeNet是最早的卷积神 ...

  5. Electron桌面应用开发基础

    Electron桌面应用开发 Electron技术架构 地址:快速入门 | Electron Chromium 支持最新特性的浏览器 Node.js Javascript运行时,可实现文件读写 Nat ...

  6. 解决MySQL自动弹出命令行窗口

    自从装了MySQL之后,我的电脑就会在某些时刻弹出一个黑乎乎的命令行窗口,然后立马消失.一开始还以为是电脑出了什么故障,但一直没有出现其他什么问题,就是玩游戏时弹出来有点难受.有一次我眼睛看到了一闪而 ...

  7. postgresql json取值为何这么慢?

    一.缘起 慢sql分析,总行数80w+. 比较特殊的是:其中有个字段info是jsonb类型,写法:info::json->'length' as length 同样的查询条件查这个字段和不查这 ...

  8. 大数据实战手册-开发篇之spark实战案例:实时日志分析

    2.6 spark实战案例:实时日志分析 2.6.1 交互流程图 2.6.2 客户端监听器(java) @SuppressWarnings("static-access") pri ...

  9. 为控制器生成OpenAPI注释

    非常喜欢. NET 的 /// 注释,写代码的时候就顺道完成写文档的过程,简直不要太爽了. ASP. NET CORE 也是一样的,通过 Swagger 工具,可以自动生成 API 的接口文档(Ope ...

  10. Linux 一些常用命令

    Linux命令的分类 1.帮助命令(help) 2.常用系统工作命令 3.常用状态检测命令 4.工作目录切换命令 linux命令在线中文手册 Linux常用命令 echo命令 作用:在终端输出字符串或 ...