当前位置: 首页 > news >正文

数据比较时String未转成BigDecimal的坑

如果价格的字段是String,要转换成BigDecimal等数字再比较,用String比较会出现奇怪的错误。

这句话看起来很多余,但是实际写代码的时候确是很容易忽略。

比如价格这个字段封装在对象里,而你只是a.getPrice().compareTo(b.getPrice())

CompareTo的String与BigDecimal对比

这里的场景是:假设市场价格mktPx >= 我的目标价格targetPx,我就卖出

但String的CompareTo是把String的值,也就是char []数组,按index比较两个对象对应index的char值的大小

6.555和6.5550前4位都相等,方法直接返回len1 - len2,mktPx的长度<targetPx,所以比较结果-1显示这两个价格不相等

@Test
public void testCompareTo() {String mktPx = "6.555";String targetPx = "6.5550";System.out.println("String: " + mktPx.compareTo(targetPx));BigDecimal mktPx1 = new BigDecimal(mktPx);BigDecimal targetPx1 = new BigDecimal(targetPx);System.out.println("BigDecimal: " + mktPx1.compareTo(targetPx1));
}/*String: -1		// 价格不相等 ×BigDecimal: 0	// 价格相等 √
*/
String的CompareTo
// java.lang.String#compareTo
public int compareTo(String anotherString) {int len1 = value.length;int len2 = anotherString.value.length;int lim = Math.min(len1, len2);char v1[] = value;char v2[] = anotherString.value;int k = 0;while (k < lim) {char c1 = v1[k];char c2 = v2[k];if (c1 != c2) {return c1 - c2;}k++;}return len1 - len2;
}

其他需要注意转换的点

Comparator

自己实现Comparator重载compare()方法时,遇到String字段要记得先转换再比较

@Test
public void testStringComparator() {List<String> sortedList = new ArrayList<>();sortedList.add("20");sortedList.add("100");// 默认升序排序sortedList.sort((s1, s2) -> {return Integer.compare(s1.compareTo(s2), 0);});System.out.println("String: " + sortedList.get(0));// 默认升序排序sortedList.sort((s1, s2) -> {BigDecimal price1 = new BigDecimal(s1);BigDecimal price2 = new BigDecimal(s2);return Integer.compare(price1.compareTo(price2), 0);});System.out.println("BigDecimal: " + sortedList.get(0));
}/*String: 100		// 认为(s2[0] == 1) < (s1[0] == 2) ×BigDecimal: 20	// 数字比较 20 < 100 √
*/
http://www.lryc.cn/news/274924.html

相关文章:

  • MySQL第三战:CRUD,函数1以及unionunion all
  • 业务项目中Echarts图表组件的封装实践方案
  • 鸿蒙开发之拖拽事件
  • C#使用纯OpenCvSharp部署yolov8-pose姿态识别
  • [AutoSar]基础部分 RTE 04 数据类型的定义及使用
  • c#调试程序一次启动两个工程(多个工程)
  • 轻松搭建企业知识库:10款必备工具推荐
  • 第三天学习记录
  • 内核线程创建-kthread_create
  • uniappVue3版本中组件生命周期和页面生命周期的详细介绍
  • 任务驱动式编程
  • python数据可视化之折线图案例讲解
  • QT工具栏开始,退出
  • @Async正确使用姿势
  • 试除法判定质数算法总结
  • vuetify 回到顶部
  • Socket与TCP的关系
  • RKE安装k8s及部署高可用rancher之证书私有证书但是内置的ssl不放到外置的LB中 4层负载均衡
  • 使用爬虫爬取热门电影
  • 【unity小技巧】实现没有动画的FPS武器摇摆和摆动效果
  • C语言基础知识(6):UDP网络编程
  • 12月笔记
  • 三、C语言中的分支与循环—for循环 (6)
  • tolist()读取Excel列数据,(Excel列数据去重后,重新保存到新的Excel里)
  • ChatGPT大升级,文档图像识别领域迎来技术革新
  • 2023年全国职业院校技能大赛软件测试—测试报告模板参考文档
  • 【BCC动态跟踪PostgreSQL】
  • 汽车架构解析:python cantools库快速解析arxml
  • Vue 之 修饰符汇总
  • 如何通过内网穿透实现无公网IP远程访问内网的Linux宝塔面板