double转long引发的一次线上故障
导读:问题背景问题:部分客户订单页面展示异常问题原因:double类型转成long类型,精度损失导致线上的故障。下面为出现问题的具体代码问题验证我们看下面会分别输出什么结果:837378982649737216 83737898264973727...
问题背景
问题:部分客户订单页面展示异常问题
原因:double类型转成long类型,精度损失导致线上的故障。
下面为出现问题的具体代码
问题验证
我们看下面会分别输出什么结果:
837378982649737216
837378982649737276
837378982649737276
为什么精度会丢失:
double类型占用64位
1bit(符号位) | 11bit(指数位) | 52bit(尾数位) |
---|
科学计数法:拿十进制举例子:1.23x10的9次方:1.23就是尾数,9就是指数
所以double类型表示的数的范围是比long类型要大,但是,由于浮点数是基于科学计数法的,因此它们不能精确地表示某些值,例如非常大或非常小的数字。因为尾数位只用了52bit来表示。
建议:
禁止直接将double类型转成long类型,对于一些高精度计算推荐使用BigDecimal
BigDecimal是Java中提供的一种高精度数字类型,它可以表示任意精度的十进制数值,计算过程中不会有精度损失。
由于BigDecimal类型提供了高精度的数字计算功能,因此通常用于需要精确计算的金融应用程序、科学计算和工程计算等领域。
声明:本文内容由网友自发贡献,本站不承担相应法律责任。对本内容有异议或投诉,请联系2913721942#qq.com核实处理,我们将尽快回复您,谢谢合作!
若转载请注明出处: double转long引发的一次线上故障
本文地址: https://pptw.com/jishu/4756.html