java账单补齐,财务说账单上少了一分钱,老板看到代码气疯了

听说微信搜索《Java鱼仔》会变更强哦!

本文收录于JavaStarter ,里面有我完整的Java系列文章,学习或面试都可以看看哦

(一)前言

在刚学Java的时候,我们老师就和我们说float和double的精度是存在误差的,原因在于二进制中没有准确表示比如0.1,0.00001这样的数据,甚至于操作系统的位数也会影响到float和double的精度。刚好前几天遇到了这样一个问题,一个财务对接系统反馈金额账上对应不上,检查历史代码后发现竟然有人用float去修饰了金额,导致计算后精度误差。

public static void main(String[] args) {

float a=50.49f;

System.out.println(a);

System.out.println(a*10);

}

比如这段代码,结果是:

50.49

504.90002

这已经是很低级的错误了。

(二)Java中如何处理金额

Java中提供了一个类BigDecmal来进行精确计算,BigDecmal中提供了多种构造方法,但是如果是金额相关数据,建议一定要使用String来构造。

public static void main(String[] args) {

float a=50.49f;

String a2=String.valueOf(a);

BigDecimal bigDecimal=new BigDecimal(a);

System.out.println(bigDecimal); //输出50.490001678466796875

BigDecimal bigDecimal2=new BigDecimal(a2);

System.out.println(bigDecimal2); //输出50.49

}

原因通过代码就可以看出来了,使用float构造方法,转换出来的数据依旧是不精确的。

BigDecimal的操作最常用的就是加减乘除,他也提供了这一系列的方法:

public static void main(String[] args) {

BigDecimal bigDecimal=new BigDecimal("50.49");

System.out.println(bigDecimal);

System.out.println(bigDecimal.add(new BigDecimal("10"))); //加

System.out.println(bigDecimal.subtract(new BigDecimal("10"))); //减

System.out.println(bigDecimal.multiply(new BigDecimal("10"))); //乘

System.out.println(bigDecimal.divide(new BigDecimal("10"))); //除

}

有关BigDecimal的更多操作可以查阅官方文档。

除了使用BigDecimal之外,还可以换个思路。比如一个金额如果需要保留两位小数,那么我们就可以在计算时按分来计算,比如100元就是10000分,这个10000分是整型。不过还是建议使用BigDecimal。

(三)Mysql中如何存储金额

在Mysql中,可以用decimal字段记录金额:

`money` DECIMAL(18,2) not null comment '金额'

同时也能用varchar以字符串的方式保存

或者通过int或者bigint来存储以分为单位的金额。

具体如何选择,还是要看项目中如何使用。

(四)总结

总结一句,凡是代码中和钱打交道的业务,务必要小心谨慎,多测试几遍。不然出事情之后很难收尾。我是鱼仔,我们下期再见!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值