Double类型精度缺失-19.9变为19.89

好久没更新了,从年前忙项目上线到过年等一系列事把计划都耽误了,要调整一下了

公司项目在添加商品的时候当商品价格输入为19.9的时候,录入到数据库就变为19.89了
经过debug调试后发现

int a = (int)(19.9 *100);

这段代码出了问题 原来

19.9 作为 Double 类型表示,二进制形式是:
1 00000000110 011111001100110011001100110011001100110011001100110
(注意中间的两个空格,如果你不知道啥意思,就去查查double的内存表示形式吧)
但是19.9 * 100 由于是二进制运算的结果是
1 00000010011 111000101111111111111111111111111111111111111111111
由于后面有n个11111所以我猜测可能发生了溢出被计算机舍去了.
于是这个数字比 1990少那么一点点(可能是 1989.99999999…)
但是你的取整操作却直接截断了后面的数字,于是成了1989

解决办法:
使用BigDecimal做运算

http://baike.baidu.com/link?url=7iTValVRzH5jrQGuAvaqB7TLokMa8QGZTgBxv8FUNRXEmiKunAPr4DGHuhaNtWitfFPWoWKiOIYw296TmGuXUq

BigDecimal bignum1 = new BigDecimal("19.9");  
BigDecimal bignum2 = new BigDecimal("100");
BigDecimal bignum3 = bignum1.multiply(bignum2); //乘法运算 
int result = bignum3 .intValue();
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值