BigDecimal判断为零避坑

mybatis:BigDecimal判定0值时问题 问题 在Mybatis中,遇到入参类型为BigDecimal时,不为0的情况下用!=''方法可以正常判断, 但值为0时使用 !=''判定会出现问题。 BigDecimal fine_cash=new BigDecimal("0");//违约金 Stringbill_id="1001"; tmap.put("bill_id",bill_id); tmap.put("fine_cash",fine_cash); monthBillDAO.updateByBillID(tmap);//执行myb. 阅读详情

项目运行中报错如下:

 看代码如下,刚开始没发现问题

private String getRate(BigDecimal a,BigDecimal b) {
        NumberFormat percent = NumberFormat.getPercentInstance();
        percent.setMaximumFractionDigits(2);
        if(a.equals(BigDecimal.ZERO)){
            return "--";
        }else{
            BigDecimal divide = a.subtract(b).divide(a, 4, BigDecimal.ROUND_CEILING);
            return percent.format(divide.doubleValue());
        }
    }

后来查文档发现,BigDecimal用equals时会进行两个判断,先判断精度是否相同,如果不相同直接返回false,经度相同的情况下再判断值是否相同。在需要判断BigDecimal是否为0时需要用compareto()方法

改正后的代码如下:

private String getRate(BigDecimal a,BigDecimal b) {
        NumberFormat percent = NumberFormat.getPercentInstance();
        percent.setMaximumFractionDigits(2);
        if(a.compareTo(BigDecimal.ZERO)==0){
            return "--";
        }else{
            BigDecimal divide = a.subtract(b).divide(a, 4, BigDecimal.ROUND_CEILING);
            return percent.format(divide.doubleValue());
        }
    }

Java BigDecimal比较:compareTo与equals的区别与实战避坑指南 在Java高精度数值计算领域,BigDecimal是处理金融、科学计算的核心类。其比较操作涉及数值大小与对象相等性的不同维度,理解compareTo与equals方法的本质区别是避免线上事故的关键。compareTo方法遵循Comparable接口契约,专注于纯数值的大小比较,忽略精度差异,是排序、范围校验等业务逻辑的黄金标准。而equals方法则严格比较数值和精度,用于需要区分精度的精确匹配场景,如HashMap键值对。误用equals进行数值等值判断是常见陷阱,可能导致金额核对、条件判断等核心业务逻辑出 阅读详情

相关推荐

血的教训,BigDecimal踩过的坑

所以就不存在精度问题了。当然,这里要特别注意的是,valueOf方法对double类型的值可以保证精度,但是如果传的是float类型,例如0.8f,则依然会有精度问题。使用BigDecimal构造函数和使用valueOf方法初始化,两种方式得到的结果不一样,valueOf方法初始化的BigDecimal数据计算是精确的。由于计算机天生的无法表达完整的二进制浮点数的小数,二进制的小数是无限循环的,所以只能无限接近于精确值,这就造成了浮点计算的精度问题。否则,将返回除法的确切结果,就像对其他操作所做的那样。

cz285933169的专栏 1092

判断Bigdecimal类型是否等于0的方法

1.我之前用来判断Bigdecimal类型是否等于0的方法 b.equals(BigDecimal.ZERO); 用equals方法和BigDecimal.ZERO进行比较。 2.上面方法存在的问题 有一天,调用这个这句代码的时候,传入的确实是0,但却返回false 查看源代码发现: Bigdecimal的equals方法不仅仅比较值的大小是否相等,首先比较的是scale(scale是bigdecimal的保留小数点位数,比如 new Bigdecimal("1.001"),sc...

mr_green1024的博客 2万+

如何对BigDecimal进行非0判断

当返回值为负数时,表示当前 BigDecimal 小于 BigDecimal.ZERO;当返回值为正数时,表示当前 BigDecimal 大于 BigDecimal.ZERO。在上述示例代码中,我们创建了两个 BigDecimal 对象 number1 和 number2,并使用 compareTo 方法将它们与 BigDecimal.ZERO(表示零)进行比较。如果你要对 BigDecimal 进行非零判断,可以使用 compareTo 方法将 BigDecimal 与零进行比较。

舒一笑的博客 3590

Java中常用的BigDecimal的定义和用法

最近涉及到浮点数金额的一个运算,为了不失精度,想到了之前刷题用过的BigDecimal,也借此对它进行一个简单的复习。 Java在java.math包中提供的API类BigDecimal对超过16位有效位的数进行精确的运算。双精度浮点型变量double可以处理16位有效数。在实际应用中,需要对更大或者更小的数进行运算和处理。float和double只能用来做科学计算或者是工程计算,在商业计算中用java.math.BigDecimal更为精准。BigDecimal创建的是...

A1292218927的博客 4855

Java中正确判断BigDecimal是否为空的多种方法及其应用场景

通过对上述方法的理解和应用,我们可以避免因错误的空值或零值引发的问题,从而保证程序健壮性和数据准确性。同时,建议遵循良好的编码规范,如在可能抛出。类因其高精度和不可变性而在金融和其他需要精确计算的领域得到广泛应用。然而,在处理此类数据时,确保它们不为空或零是一个常见的需求。,也可以被赋予零值。在实际开发中,我们需要区分这两种状态:“空”表示引用未指向任何对象,“零”则表示指向了一个数值为零的。这是最直观且最基础的检查方式,适用于任何对象类型的空值判断。的地方提前进行空值检查,提升代码的可读性和可靠性。

gongjin28_csdn的博客 1万+

三维模型转变为点云模型的好工具——CloudCompare使用小记

普通三维模型能够直观地展示物体的三维全貌,但是在一些场合需要将三维模型变为相应的点云模型进行展示,而使用激光雷达等传感器采集到的点云信息往往只能反应模型表面的情况,或是使用PCL库中的可执行文件进行转换,这两种操作较为麻烦。笔者最近就遇到了这样一个情况,找到了一个名叫CloudCompare(CC)的软件,能够支持将多种文件格式的三维模型转变为点云模型。以下将本人在使用过程中所使用到的一些操作简记下来供朋友们和将来的自己参考。 一、下载 CloudCompare是一款免费软件,其可以在CloudComp

hdlwyt的博客 2万+

BigDecimal使用常见错误:初始化不精确,与0比较,除数为0

结论: BigDecimal初始化小数时,尽量用字符串形式,例如newBigDecimal("0.1"); BigDecimal类型变量比较大小时用compareTo方法,判断变量值是否为0,与BigDecimal.ZERO比较大小。 BigDecimal作除法时,除了要考虑除数是否为0,更要考虑是否能除尽的问题,直接调用BigDecimaldivide(BigDecimal divisor, int scale, int roundingMode)方法做除法可以避免除不尽的问题。 初...

lanelanelane的博客 8308

最优化理论与自动驾驶(三):LQR原理、公式及代码演示

LQR 是基于线性系统和二次型代价函数的最优控制方法,在实际工程应用中,我们一般采用离散时间系统的LQR设计,其目标是通过设计反馈控制律,使系统在离散时间步长内稳定运行,最小化某个二次型代价函数。给定一个离散时间系统,其状态和控制输入通过以下方程表示:是时刻k的系统状态,是时刻k的控制输入,是状态转移矩阵,是输入矩阵。系统描述的物理意义:系统状态通过矩阵A演变到下一时刻,同时控制输入通过矩阵B影响系统的状态。

a8598671的博客 4595

bigdecimal判断是否为零(compareTo比较大小)

1.判断Bigdecimal类型是否等于0的方法b.equals(BigDecimal.ZERO); 用equals方法和BigDecimal.ZERO进行比较。 2.上面判断是否等于零存在的问题: 我们来查看源代码: Bigdecimal的equals方法不仅仅比较值的大小是否相等,首先比较的是scale(scale是bigdecimal的保留小数点位数,比如 new Bigdecimal(“1.001”),scale为3),也就是说,不但值得大小要相等,保留位数也要相等,equals才能返回true。

wjw_de_java的博客 6万+

Comsol单层焊缝焊接数值模拟:温度场与应力场全流程解析

在工程制造领域,有限元模拟是研究焊接热-力行为、优化工艺参数的重要工具。焊接过程涉及强烈的局部加热和快速冷却,材料经历复杂的非线性和相变,必须通过瞬态分析和热-力顺序耦合,才能准确捕捉移动热源作用下的温度演化与应力塑性积累。这一技术广泛应用于压力容器、船舶结构、车辆制造等场景,用以预测残余应力与变形、评估冷裂纹风险,并为工艺设计提供定量支撑。焊接数值模拟能否真正指导实践,关键在于热源校核、随温度变化的材料参数、合理的边界条件与网格策略。单层焊缝作为焊接模拟的基础模型,涵盖了移动热源加载、熔池形成、高温软化与

weixin_30444111的博客 223

AI系统架构设计实战:AI应用架构师的深度指南

核心概念:AI系统架构是指设计和组织人工智能系统各个组件(包括数据、算法、计算资源、集成接口等)的结构框架,以及这些组件之间的交互方式和原则。它为AI应用提供了技术蓝图,决定了系统的性能、可扩展性、可维护性和可靠性。数据的本质:数据是对客观事物的符号表示,是可识别的、抽象的符号。在AI系统中,数据不仅是输入,也是系统学习和改进的基础。数据就像AI系统的"燃料",其质量和数量直接决定了AI系统的能力边界。

AI天才研究院 1199

判断一个BigDecimal数值是否为零

判断一个BigDecimal数值是否为零,不能用“==”,需要用以下的句子 if(yourvalue.equals(BigDecimal.ZERO))

James_qqh的博客 2万+

免费 AIS船舶轨迹预测 数据集 分享 (可用于长周期轨迹预测)

论文中使用的数据由提供。有关预处理步骤的详细信息,请参阅。

qq_43747519的博客 1万+

【BigDecimal】避坑分享之BigDecimal的四大注意

在Java中,BigDecimal类常被应用在商业计算中来处理数值计算问题。但在使用过程中,其暴露了一些问题值得引起我们注意。

weixin_51360020的博客 1901

K-GAS解读(08)

大众kgas标准,大众及其供应商kgas

m0_51113317的博客 598

【MATLAB】通过计算曲率和曲率变化率来实现对曲线波浪程度

这段代码将计算给定曲线的曲率,并与给定阈值进行比较以检测拐角。函数是MATLAB中一个常用的函数,可以用于计算曲线在每个点处的曲率。它基于一种被称为“local least squares fitting” 的方法,通过拟合每个点周围的一小段曲线来计算曲率。MATLAB中可以使用多种方法实现拐角检测,其中一种方法是基于曲率半径的算法。该算法通过计算曲线上每个点处的曲率半径,找到拐角和弯曲处。是一个可选参数,用于控制拟合曲线的平滑度,取值范围为0到1,越接近1表示曲线越平滑。表示曲线在每个点处的曲率,

Fanjufei的博客 1919

Java BigDecimal用法及避坑最佳实践

BigDecimal是 Java 中用于处理高精度浮点数运算的类,尤其在金融计算、科学计算等领域,精度变得尤为重要。与传统的double和float类型相比,BigDecimal提供了更高的精度和可靠性。BigDecimal是处理高精度计算的强有力工具,但在使用过程中需要注意上述提到的坑,以确保计算的准确性和可靠性。在需要高精度计算的场景下推荐使用BigDecimal,但要注意避免上述提到的坑,并权衡性能损失。

周国通的博客 1173

【GeoDa实用技巧100例】024:geoda计算全局(局部)莫兰指数Moran‘s I,LISA聚类地图,显著性地图

【GeoDa实用技巧100例】024:geoda计算全局(局部)莫兰指数Moran's I,单变量莫兰指数,双变量莫兰指数计算,LISA聚类地图,显著性地图,Geoda双变量莫兰指数是一种强大的地理空间数据分析工具。

智慧空间实验室 6052

BigDecimal 判空与零值判断:3种常见误区的代码修复与性能对比

本文深入探讨了Java中BigDecimal判空与零值判断的3种常见误区,包括使用equals()方法的精度陷阱、忽略null检查的直接比较以及混淆空值与零值的业务语义。通过代码修复方案、工具类实现和性能对比,帮助开发者在金融系统等关键场景中避免资金误差,提升代码可靠性与性能。

benben 881

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

BigDecimal 使用注意!!“别踩坑”

你以为用了BigDecimal后,计算结果就一定精确了?

RichardGeek的博客 1339

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

BigDecimal比较大小,BigDecimal判断是否为0

原文链接:https://blog.youkuaiyun.com/qq_34926773/article/details/83419004 在做项目时,经常用到BigDecimal类型的数据,需要比较大小: 声明BigDescimal: BigDescimal bd = new BigDescimal(str1); Integera=bd1.compareTo(bd2); a=-1,表示bd1小于bd2; a=0,表示bd1等于bd2; a=1,表示bd1大于bd2; 所以判断BigDe...

zitian246的博客 8398

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

BigDecimal的坑

1、BigDecimal类型的数据在转为字符串的时候如果为空会报错。应该判断是否为空 null != bigDecimal ? bigDecimal.toString() : "" 2、BigDecimal类型的数据在比较时不用=用compareTo()。 3、BigDecimal的零不是0,是BigDecimal.ZERO。 4、判断是否为零要和零值比较大小的状态值是否为零 new...

qq_33875256的博客 4222

BigDecimal精度的哪些坑

Java在java.math包中提供的API类BigDecimal,用来对超过16位有效位的数进行精确的运算。双精度浮点型变量double可以处理16位有效数,但在实际应用中,可能需要对更大或者更小的数进行运算和处理。一般情况下,对于不需要准确计算精度的数字,可以直接使用Float和Double处理,但是Double.valueOf(String)和Float.valueOf(String)会丢失精度。所以如果需要精确计算的结果,则必须使用BigDecimal类来操作。...

BUG指挥课堂 2570

BigDecimal相加一直为零的坑,解决BigDecimal相加为0的方法

在使用BigDecimal时,相加一直为零,感觉有点坑。正确写法:累加之后需要进行接收。

1加1等于的博客 1408

BigDecimal整除判断

需求:WMS有两种规则的包装单位,一级包装(小单位),二级包装(大单位),例如比列关系1箱牛奶=12盒牛奶。 展示包装数量时,需要进行包装单位换算,一级包装单位换成二级单位,当能换成二级单位时(大),则显示二级单位,否则显示一级单位(小)。 如果库存数量是120盒牛奶,直接显示10箱; 如果库存数量是100盒牛奶,直接显示100盒。 包装数量使用BigDecimal类型的变量存放,这里就用到...

lily_better的博客 1万+
上一篇: mybaties使用笔记
下一篇: 使用vagant 和 Virtualbox时需要注意的事项
learnjava1989
博客等级 码龄9年 9粉丝 23原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值