被辞退了,因为小数点计算错误

今年IT寒冬,大厂都裁员或者准备裁员,作为开猿节流主要目标之一,我们更应该时刻保持竞争力。为了抱团取暖,林老师开通了知识星球,并邀请我阿里、快手、腾讯等的朋友加入,分享八股文、项目经验、管理经验等,帮助大家提升技能,安稳度过这个寒冬,快扫描(长按)加入我们吧!

故事背景

今天我一个同事跟我吐槽,说他朋友因为程序问题,被公司辞退了,而且还没有任何补偿。我一听马上问,是删库跑路了嘛,这么严重。他说比这个还严重,说因为BigDecimal小数点四舍五入出现问题,导致订单金额偏低,公司损失了十几万美金,而且因为发现的晚,订单都已经发货了,钱要不回来了,造成很大的影响。虽然他朋友是公司老员工,但是发生这么大的事情,也只能引咎辞职了,而且因为个人问题导致公司权益受损,公司有权辞退,并且不进行任何赔偿。

故事带来的教训

我听完这个事情,久久无法回神,对众多小公司而言,因为用户量不高,服务宕机一段时间,其实不会直接造成非常大的影响(滴滴这种独角兽除外),而金额计算错误导致的问题,大多数都是非常致命的错误,目前金额计算一般都采用BigDecimal来进行运算,但是如果BigDecimal不会用或者没用好,也是会造成严重的线上问题。

为了引以为戒,博主特意整理了BigDecimal的易错场景,来培训团队成员,让大家引以为戒,可以用好BigDecimal,计算好金额,保住自己的饭碗。

易错点一:BigDecimal构造参数导致精度丢失问题

BigDecimal decimal = new BigDecimal(0.01);
打印实际值:0.01000000000000000020816681711721685132943093776702880859375
建议使用:BigDecimal.valueOf()方法赋值,比如:
BigDecimal decimal1 = BigDecimal.valueOf(0.01);
同时,如果在高并发或者大量对象创建场景时,也不建议使用new BigDecimal方式创建对象,否则会影响性能,同样推荐BigDecimal.valueOf方式创建对象。

知识点:所以推荐使用BigDecimal.valueOf来赋值,确保金额数据的精度正确。

易错点二:正确使用两个BigDecimal对象的大小比较

num1.equals(num2) 或者 num1.compareTo(num2) 都是比较两个数的大小,但是它们有区别:
equals会先比较值,再比较精度;而compareTo直接比较值,不会比较精度。
BigDecimal decimal2 = new BigDecimal("0.01"); BigDecimal decimal3 = new BigDecimal("0.010"); //false,因为精度不一样 decimal2.equals(decimal3); //true, 只比较数值,不会比较精度 decimal2.compareTo(decimal3)==0;

知识点:所以要根据业务正确选择比较大小方法,确保业务逻辑的正确性。

易错点三:做除法运算时,必须设定精度和选择正确的舍入模式

BigDecimal d1 = BigDecimal.valueOf(1.00); BigDecimal d2 = BigDecimal.valueOf(3.00); BigDecimal d3 = d1.divide(d2);

上述代码执行后,会直接抛出异常:java.lang.ArithmeticException: Non-terminating decimal expansion; no exact representable decimal result.
正确写法:
// 精度设置为2位,选择向远离零的方向四舍五入 BigDecimal d3 = d1.divide(d2, 2, RoundingMode.HALF_UP);
BigDecimal舍入模式:

  • RoundingMode.UP:向远离零的方向舍入
  • RoundingMode.DOWN:向靠近零的方向舍入
  • RoundingMode.CEILING:向正无穷方向舍入
  • RoundingMode.FLOOR:向负无穷方向舍入
  • RoundingMode.HALF_UP:向远离零的方向四舍五入
  • RoundingMode.HALF_DOWN:向靠近零的方向四舍五入
  • RoundingMode.HALF_EVEN:银行家舍入法,遵循IEEE 754标准

知识点:所以做除法运算时,务必设定精确位数,避免系统异常崩溃。并且正确理解舍入模式的含义,有助于满足业务的需求。

易错点四:BigDecimal对象一旦设值不可修改原则问题

BigDecimal使用setScale方法设置精度时,原对象不会被修改,需要用新对象去接收。
BigDecimal num = new BigDecimal("1.2345"); // num变量并没有变化,还是4位小数; num.setScale(2, RoundingMode.HALF_UP); // result 才是四舍五入后并保持2位小数点。 BigDecimal result = num.setScale(2, RoundingMode.HALF_UP);

知识点:我们要理解不可变的特性,不要出现理解上的歧义,导致业务出现问题。

复盘反思

BigDecimal只是Java功能中小到不能再小的功能点,但是却有这么多的注意事项。写了这么多年代码之后,我可以明显的感觉到,初级开发和高级开发有着非常明显区别,特别是对待程序严谨性上,经验越多的程序员,可以想到更多的异常场景,从而保证最后的开发质量。

林老师带你学编程知识星球,创始人由工作10年以上的一线大厂人员组成,希望通过我们的分享,帮助大家少走弯路,可以在技术领域不断突破和发展。

具体的加入方式

星球内容涵盖:Java技术栈、Python、大数据、项目实战、面试指导等主题。

### 回答1: 如果前端程序员被辞退,可以采取以下措施: 1.了解辞退原因:了解辞退原因,分析自身问题,找到不足之处,以便下一步的职业规划。 2.寻找新的工作机会:可以通过招聘网站、社交媒体、招聘会等途径寻找新的工作机会。 3.提升自身技能:可以通过学习新的技术、参加培训课程、参与开源项目等方式提升自身技能,增加自身竞争力。 4.保持积极心态:面对辞退,保持积极心态,不要放弃,相信自己能够找到更好的工作机会。 总之,前端程序员被辞退并不是终点,而是一个新的起点,需要积极面对,寻找新的机会和发展方向。 ### 回答2: 前端程序员如果被辞退,首先要保持冷静和理性的思考。以下是一些应对被辞退的建议: 1. 自省与总结经验:仔细回顾自己在该公司的工作表现,找出可能导致被辞退的原因,并总结经验教训。这不仅可以帮助你提升自己,还能避免类似错误在未来的工作中再次发生。 2. 学习和提升技能:分析当前的前端开发技术趋势,了解市场需求,有针对性地学习新的技术和工具,提升自己的能力水平,增加自身的竞争力。 3. 修改和完善简历:根据被辞退后的工作经验和技能提升,及时更新和修改个人简历,更加准确地描述自己的工作经历和技能,并突出自己的优势和能力。 4. 寻找新的工作机会:积极寻找新的工作机会,可以通过在线招聘网站、社交媒体、人脉关系等多种途径获取信息并投递简历。注意关注行业的招聘动态和热门公司的招聘需求,积极参与面试。 5. 提升面试能力:参加面试时,准备充分,了解公司的背景和要求,回顾自己在前一份工作的项目经验和成果,充分展示自己的能力和潜力,积极表达自己的学习能力和适应能力。 6. 网络建设和自我推广:在互联网上建立个人品牌和社交媒体形象,发布自己的项目经验、技术博客等内容,积极参与技术社区和开源项目,提高曝光度和知名度,为自己的职业发展打下基础。 7. 转型或寻找其他机会:如果发现自己在前端开发领域遇到了瓶颈或兴趣转移,可以考虑转型到其他领域,或寻找其他的就业机会。这可能需要更多的学习和调整,但也可能为自己带来新的挑战和机遇。 无论发生什么情况,都要保持积极的心态和努力,不断提升自己,相信下一份工作会更好。 ### 回答3: 如果一个前端程序员被辞退了,他可以考虑以下几个方向来维持自己的职业生涯: 1. 提升技术能力:前端技术不断演进,学习新的技术和框架,提升自己的技术水平,增加就业竞争力。 2. 扩展技能树:除了前端开发,可以学习并掌握后端开发、移动端开发等技能,以拓宽自己的就业范围。 3. 更新简历和求职资料:认真总结以前的工作经验和项目,准备一份新的精确、详细和有吸引力的简历和求职信。 4. 寻找项目经历:通过参与开源项目、自己开发个人项目或者参与志愿者,在失业期间继续积累项目经验,展示自己的技能与能力。 5. 提升沟通与协作能力:在技术面试中,除了技术能力,沟通与协作能力也是雇主重视的因素。可以通过参加技术社区、参与线下聚会等方式与他人多交流,提高自己的沟通与协作能力。 6. 寻求进修与培训机会:利用失业期间,可以参加相关的培训、课程和研讨会,学习新知识和技能。 7. 利用互联网资源:在求职网站、社交媒体上查找合适的工作机会,积极提交简历和进行面试。 8. 寻求帮助与支持:可以向相关的社区、论坛或者前辈们咨询、寻求建议和帮助。 总之,被辞退并不是终点,重要的是如何面对挑战并持续发展。前端程序员可以通过不断学习、扩展技能树、提高沟通与协作能力,积极寻找工作机会,为自己的职业生涯铺就一条更加成功的道路。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值