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