android开发系列之6*0.9不等于5.4
2016-03-07 16:40
429 查看
昨天晚上我们客户端平台上面曝出了一个很奇诡的bug,那就是本来在客户端里面有个商品买6元,但是因为碰巧赶上打9折,这个时候我们很自然的处理就是6*0.9。好吧你以为so easy的事情,其实就出错了,我们客户端里面显示出来的是5.39。那么问题就来了,损失的那一分钱去哪了呢?
聪明的你也许很快就会想到可能是小数点精度的问题,但是我们客户端将6和0.9都是定义成float类型的呀!不可能说会存在类型转换,精度丢失的情况。经过多次测试和查阅资料我们发现原来是java自身处理机制的问题,至于到底怎么样的一套处理机制,我在网上找到的资料也说的不是太清楚,在这里就不老王卖瓜了。我只能告诉你处理的方法,代码如下:
前一个参数是原始价格,也就是6;后一个参数是打折数值0.9,然后通过setScale方法设置两位小数,并且设置最接近取舍数值,这样我们就得到想要的5.4了。
聪明的你也许很快就会想到可能是小数点精度的问题,但是我们客户端将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了。
相关文章推荐
- Android滑动事件冲突(demo演示)
- android应用程序静态分析工具androguard初体验
- 推荐几款实用的Android Studio 插件
- Android Studio如何创建NDK工程
- android 很好的開源項目
- Android开发设计模式之——单例模式
- Android串口通信
- EventBus事件总线的使用
- Android 相机调用简化工具
- android应用程序如何调用支付宝接口(转)
- 基于Jenkins+git+gradle+pgyer的android持续集成
- android大众常用的五种布局
- android 删除某个目录及其子目录
- Snackbar-Android M新控件
- Android APK终极瘦身21招
- Android 数据存储
- Android ViewPager使用详解
- android逆向分析中常用的smali注入代码
- Android WebView实现原生与JS的交互
- Android应用与系统安全防御