BigDecimal实际开发的三坑是什么

坑1:初始化使用double类型数据public class testbigdecimal { public static void main(string[] args){ bigdecimal b1=new bigdecimal(0.22); bigdecimal b2=new bigdecimal(0.22); system.out.println(b1的值:+b1); system.out.println(b2的值:+b2); }}结果 :
b1的值:
0.2200000000000000011102230246251565404236316680908203125
b2的值:0.22
原因:
构造方法参数为double类型有一定的不可预知性,表面上看是0.22,实际上是0.2200000000000000011102230246251565404236316680908203125,0.22在java中无法准确的表示为double
解决方案:
1.采用string 类型的构造参数。
2.如果必须要使用double,则可使用double.tostring(double) 方法转换成string, 再采用bigdecimal的构造函数.
坑2:除法计算public static void t1(){ bigdecimal b1=new bigdecimal(10); bigdecimal b2=new bigdecimal(3); system.out.println(b1.divide(b2).setscale(2,bigdecimal.round_half_up));}结果:
exception in thread main java.lang.arithmeticexception: non-terminating decimal expansion; no exact representable decimal result
原因:
当遇到除不尽的情况时,会报以上错误
解决方案:
system.out.println(b1.divide(b2,2,bigdecimal.round_half_up));
坑3:equals方法public static void t2(){ bigdecimal b1=new bigdecimal(0.0); bigdecimal b2=bigdecimal.zero; system.out.println(b1.equals(b2));}结果:
false
原因:
bigdecimal 的equals 方法不仅仅是比较值,还会比较scale的位数是否相等,而bigdecimal.zero的scale是0,所以为 false
解决方案:
使用compareto方法. system.out.println(b1.compareto(b2)==0)

紫光芯领跑高精尖产业创新征程,紫光云加速产业全面升级
Telegram正在使用比特币来绕过俄罗斯政府的封锁
12306网站用户信息泄露 涉及410万名旅客信息
首个中文医学知识LLM:真正的赛华佗—华驼(HuaTuo)
在windows CE系统中sDRAM硬件连接方案的介绍
BigDecimal实际开发的三坑是什么
三星拿到美方的许可令,获准继续向华为出货OLED显示面板
利用Learn Git Branching轻松学习Git
CERN如何使用深度学习和英特尔oneAPI加速蒙特卡洛模拟介绍
红米K40 Pro真机曝光
蒋尚义将赴武汉弘芯任CEO
热敏打印头的原理是什么
vivo发布NEX 3 5G旗舰智能手机 无边框+64万像素
Mobvoi推出新品智能手表,搭载高通骁龙新品和血氧监测功能
零度重回无人机市场 打造复合翼无人机
中伟视界&矿山安全生产:煤矿智慧矿山ai平台建设方案,ai平台由哪几部分组成
基于sopc嵌入式文字识别系统设计
山寨与专业的区别
巴特沃斯滤波器的原理_巴特沃斯滤波器优点介绍
群英荟萃!物联网大咖们聚会是为了啥?