昨天晚上我们客户端平台上面曝出了一个很奇诡的bug,那就是本来在客户端里面有个商品买6元,但是因为碰巧赶上打9折,这个时候我们很自然的处理就是6*0.9。好吧你以为so easy的事情,其实就出错了,我们客户端里面显示出来的是5.39。那么问题就来了,损失的那一分钱去哪了呢?

聪明的你也许很快就会想到可能是小数点精度的问题,但是我们客户端将6和0.9都是定义成float类型的呀!不可能说会存在类型转换,精度丢失的情况。经过多次测试和查阅资料我们发现原来是java自身处理机制的问题,至于到底怎么样的一套处理机制,我在网上找到的资料也说的不是太清楚,在这里就不老王卖瓜了。我只能告诉你处理的方法,代码如下:

public static float getRightPrice(float origionPrice, float saleOff) {
BigDecimal bOrigionPrice = new BigDecimal(origionPrice);
BigDecimal bSaleOff=new BigDecimal(saleOff);
float rightPrice=bOrigionPrice.multiply(bSaleOff).setScale(2, BigDecimal.ROUND_HALF_UP).floatValue();
return rightPrice;
}

前一个参数是原始价格,也就是6;后一个参数是打折数值0.9,然后通过setScale方法设置两位小数,并且设置最接近取舍数值,这样我们就得到想要的5.4了。

最新文章

  1. Newtonsoft.Json设置类的属性不序列化
  2. Linux Linux程序练习十九
  3. 编译器 expected unqualified-id before numeric constant 错误
  4. [LintCode] Copy Books 复印书籍
  5. 彻底删除java*
  6. 解决 winform 界面对不齐 z
  7. hibernate - Initial SessionFactory creation failed.org.hibernate.HibernateException
  8. 7.PHP 教程_PHP常量
  9. 在Windows下搭建C++11 编译环境(附下载,包括mingw-build,TDM-GCC, nuwen MinGW Distro)
  10. REUSEADDR 选项
  11. Unity 5 Stats窗口
  12. 【viewport】移动设备的兼容性问题
  13. react-native-svg的使用
  14. 再杀掉app之后 删除NSUserDefault存在本地的数据
  15. effector - 必应词典
  16. [React] 15 - Redux: practice IM
  17. Mysql下SELECT的结果集作为UPDATE的WHERE条件时的SQL语法
  18. 【Vue】hello world
  19. Linux安全之SYN攻击原理及处理
  20. 【剑指Offer学习】【面试题22:栈的压入、弹出序列】

热门文章

  1. NSInteger 和 int 区别
  2. 开机自启动redis
  3. 【EF 2】浅谈ADO数据模型生成串(二):数据库连接串分析
  4. span标签之间的空隙
  5. 解决Github访问超慢问题[自己留档]
  6. 跨域请求之JSONP 一
  7. 4种kill某个用户所有进程的方法
  8. Something wrong with FTK's index search results
  9. css中float left与float right的使用说明
  10. TCP/UDP详解