前言:毕业时间长,学校学的知识点也给我忘了。哎!
先看一张图:
图中的ECPM出现小数无限长问题。
ECPM的计算公式:(消耗/曝光)*1000。
我也知道BigDecimal可以处理高精度的数据计算。但是我却用错了方式。如图:
其实我认为我这么写时没有问题的,口头计算下就是(4975.60/400377)*1000=12.2。然而这是我的想法,计算机不是这么想的。原因在于我们的计算机是二进制的。浮点数没有办法是用二进制进行精确表示。我们的CPU表示浮点数由两个部分组成:指数和尾数,这样的表示方法一般都会失去一定的精确度,有些浮点数运算也会产生一定的误差。如:0.5的二进制表示并非就是精确的0.5。反而最为接近的二进制表示是 0.049999999999999996。所以我错误的原因就是不应该去拿浮点型和整型相乘。那么如何解决这个问题。如图:
把所有的计算都放在BigDecimal里面进行。
总结:
- 开发过程中,有时可能会拿着自己十进制的想法去编写。一定要注意下计算机是二进制。
- 做小数的加减乘除时,最好使用BigDecimal来统一处理。BigDecimal可以处理高精度的数据计算。