首页 > 其他分享 >问题总结:浮点数之间的等值判断,基本数据类型不能用==来比较,包装数据类型不能用equals来判断

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

时间:2023-09-11 11:44:25浏览次数:45  
标签:map BigDecimal get 浮点数 数据类型 equals VALUE SignData toString

浮点数之间的等值判断,基本数据类型不能用==来比较,包装数据类型不能用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));

 

标签:map,BigDecimal,get,浮点数,数据类型,equals,VALUE,SignData,toString
From: https://www.cnblogs.com/xiaotian0422/p/17693137.html

相关文章

  • Java语言的特点,面向对象和面向过程的区别,八种基本数据类型的大小以及封装类
    1、Java语言有哪些特点1、简单易学、有丰富的类库2、面向对象(Java最重要的特性,让程序耦合度更低,内聚性更高3、与平台无关性(JVM是Java跨平台使用的根本)4、可靠安全5、支持多线程2、面向对象和面向过程的区别面向过程是分析解决问题的步骤,然后用函数把这些步骤一步一步地实现,然后......
  • Java中equals和==的区别
    ====比较的是变量(栈)内存中存放的对象的(堆)内存地址,用来判断两个对象的地址是否相同,即是否是指相同一个对象。比较的是真正意义上的指针操作。1、比较的是操作符两端的操作数是否是同一个对象。2、两边的操作数必须是同一类型的(可以是父子类之间)才能编译通过。3、比较的是地......
  • C语言:数据类型之整形(一)
     什么是数据?记录一天各个时间的温度,那么这个温度就是数据.记录一个水库水位的变化值,那么这个值就是数据.什么是数据类型?1215是整数12.23是小数"helloworld"是一段话基本数据类型:数值类型:整形,浮点型。整形顾名思义就是整数,像:1,2,3,4,5就是整形整形在C语言的关键字是:int......
  • 教你快速上手C语言中的数据类型和变量
    (章节目录)前言  哈喽,各位铁汁们好啊!✨今天来给大家带来的是初识C语言里面的数据类型和变量。  今天主要带大家简单认识-一下C语言,俗话说没吃过猪肉,也见过猪跑。了解下每个数据类型是干嘛的。可以读懂C语言的简单程序,其他的博主就不多介绍了。  后面会为大家详细介绍......
  • Java基础——基本数据类型转换
    基本数据类型转换基本数据类型数据类型所占字节取值范围boolean未定false与truebyte1个字节-2^7~2^7-1char2个字节0~2^16-1short2个字节-2^15~2^15-1int4个字节-2^31~2^31-1long8个字节-2^63~2^63-1float4个字节-2^128~+2^128double8个字节-2^1024~+2^1024方法调用规则从低位类型到......
  • python进阶 day08字典数据类型内置方法
    字典数据类型内置方法1.作用对于值添加描述信息使用他2.定义方式用{}以逗号隔开加入键值对:key:valueinfo_dict={'name':'wangdapao','age':18,'height':120,'gender':'female','hobby_list':['dapao','basketball'......
  • 元组数据类型内置方法
    元组数据类型内置方法元组和列表的内置方法一模一样,但是元祖无法修改元组咋i定义的那一刻他的元素个数以及元素的值就全部固定了毫无用处,早期永远一般用于减小内存占用,以后只要定义列表就行了定义方式列表的中括号改成小括号tup=(1,2,3,4,5)内置方法查看索引位置......
  • 列表数据类型的内置方法
    列表数据类型的内置方法1.作用列表的作用就是可以描述多个值,就比如一个人可以有很多的爱好2.定义方式hobby_list=['play','swimming','dancing']print(hobby_list)lt=list('randysun')print(lt)3.内置方法优先掌握索引取值hobby_list=['play','swimming......
  • Solidity-变量和数据类型[复合类型_1]
    复合类型的数据包括:array(数组)、struct(结构体)和mapping(映射),其中array和struct也称为引用类型。复合类型数组(array)数组(array)是一种用于存储相同类型元素的集合,分为固定长度的静态数组和长度可变的动态数组。需要注意的是,数组中的元素类型不能是映射类型(mapping),因为映射类型本身......
  • Redis五大基本数据类型之Hash哈希(转载)
    一、概述Hash类型,也叫散列,其value是一个无序字典,类似于Java中的HashMap结构。String结构是将对象序列化为JSON字符串后存储,当需要修改对象某个字段时很不方便: Hash结构可以将对象中的每个字段独立存储,可以针对单个字段做CRUD: Hash类型的常见命令HSETkeyfieldvalue:......