99% 的 Java 程序员都用错 BigDecimal,难怪对账永远对不上
做开发的朋友,尤其是刚入行的新手,有没有遇到过这种“灵异事件”:明明代码逻辑没毛病,但几百笔订单一汇总,总账莫名其妙差了一毛二?排查一下午,最后发现不是业务写错了,而是你用来存钱的float或double惹的祸!
别再被“千兆”忽悠了:你的网速到底打了几折?
你是不是也遇到过这种事?运营商拼命推销“千兆宽带”,你兴冲冲装好,结果一测下载速度,才100多MB/s。心里顿时火冒三丈:说好的1000呢?是不是在坑我?别急,真不是运营商故意偷工减料,而是你被“千兆”这两个字给绕进去了。先搞明白一个最基础的换算。
线上慎用 BigDecimal,坑的差点被开了...
钱算错几分,BigDecimal也不稳,根子到底在哪。我二十岁,学Java不久,也踩过金额的坑。很多人以为把double换成BigDecimal就安全了,其实不是。线上多扣一分、返利少三分,常常是构造、比较、除法、序列化、数据库和测试里的小问题叠在一起。
金额计算字段类型用Long,还是BigDecimal ?
前言对于从事后端开发的小伙伴来说,可能会遇到金额计算字段的类型,到底该用Long,还是BigDecimal的困扰。甚至有些公司的架构师跟DBA,有时也会为了金额计算字段的类型而PK。今天这篇文章专门跟大家一起聊聊这个话题,希望对你会有所帮助。
BigDecimal用于金额计算,你以为用对了?99%的人可能都错了
但凡用Java做过金额计算,一定用过BigDecimal。但绝大多数人只用了它不到20%的功能,甚至用错了还浑然不知。今天不谈八股,只看代码。以下是我参与过的几十个支付、账务、电商项目里,最典型的真实错误和最佳实践。看完你会发现自己也可能踩过这些坑。
BigDecimal.valueof(Double t)/(String t)的区别
先用简单的代码展示一下Java代码:上面的代码主要的区别在于初始化BigDecimal时形参是double、String和float的区别从上面可以看到,当double 和 float 时,实际保存的值并不是是准确的0.
告警:线上慎用 BigDecimal,坑的差点被开了...
BigDecimal,相信对于很多人来说都不陌生,很多人都知道他的用法,这是一种java.math包中提供的一种可以用来进行精确运算的类型。
什么?使用BigDecimal计算也会出现精度问题
// Reminder: a zero double returns '0.0', so we cannot fastpath。
金额用 double 算错过账,后来一律换 BigDecimal
财务月底对账,对出来差了 3 毛 7 分钱。就这 3 毛 7,财务的同事追着我们查了整整两天。金额对不上,哪怕只差一分钱,财务都不可能放过——这是原则问题。最后定位到的根因,说出来你可能都不信,就因为一个 double。