BigDecimal保留两位小数失败问题

文章讨论了在测试代码时遇到的BigDecimal处理精度问题,特别是在使用Swagger和Postman测试时的区别。作者强调了BigDecimal的链式编程的重要性,并推荐使用Postman进行精确测试,因为其能保留小数点后的零。
摘要由CSDN通过智能技术生成

背景

测试时发现在线swagger测试会自动处理BigDecimal小数点后面的数字,就是有零的会都给你去掉,比如9.000与9.500到最后都会被swagger处理成9跟9.5。使用postman测是最准的,测出来的就是9.000跟9.500。

问题

处理运费计算结果时,setScale(2,BigDecimal.ROUND_HALF_UP)不生效

解决

BigDecimal的setScale方法会生成一个新的BigDecimal对象,生成时目前猜测是走了构造(猜测对了,看下图),所以说BigDecimal在书写时一定要使用链式编程:
这么记:使用setScale方法后会new一个新的BigDecimal对象,这个时候就是两个对象了。新生成的对象你应该接收后再返回,这样才是setScale方法处理后的数据。

public class Test {
    public static void main(String[] args) {
        BigDecimal bigDecimal1 = new BigDecimal(5);
        bigDecimal1.setScale(2, BigDecimal.ROUND_HALF_UP);
        System.out.println("不用链式编程:" + bigDecimal1);
        System.out.println("使用链式编程:" + bigDecimal1.setScale(2, BigDecimal.ROUND_HALF_UP));
        BigDecimal bigDecimal2 = bigDecimal1.setScale(2, BigDecimal.ROUND_HALF_UP);
        System.out.println("用参数接,然后输出:" + bigDecimal2);

        BigDecimal bigDecimal3 = new BigDecimal(5.500);
        bigDecimal3.stripTrailingZeros();
        System.out.println("不用链式编程:"+bigDecimal3);
        System.out.println("使用链式编程:"+bigDecimal3.stripTrailingZeros());
    }
}

image.png
首先stripTrailingZeros()方法是一个去零方法,但是我们会发现这个返回的也是BigDecimal,但是不用链式编程却没有问题,这里面的原因是什么呢?原因其实很简单,很多人一想就明白了,肯定没有创建新的BigDecimal对象,而是使用静态的自定义常量(static final修饰的变量)或者是对BigDecimal对象做内部处理,感兴趣的可以点进去看看。
image.png

如何测试代码

测试的话最好用postman测,它相对于swagger来说是更严谨的。在运费计算接口中,实际返回的是9.000,但是swagger响应的就是9,这诚然不是我们想要的,我不需要你给我进行处理,因为这样我会造成误判。正好postman响应回来的就是9.000,所以选择使用postman。

使用postman时地址不要直接swagger上粘过去,打开F12,用swagger发一次请求,找到network找到请求头,然后复制访问的curl粘到postman

  • 7
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Jayden 

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值