从一个bug到了解浮点数

有次qa提了一个bug,就是假如输入999999.99时候,会发现存到数据库是1000000。后面一看代码原来是自己手抖,平常用double来转换,突然有个地方写成了float。改后就ok。但是仔细一想,这个为什么刚好是这个值转换出错,学过计算机的都知道,float存储用二进制,所以有精度差,但是究竟是怎样一个存储法呢。大学学到的知识都忘记了。赶紧复习下。
这是基于IEEE 754,是IEEE二进位浮点数算术标准。
float是单精度,32位,1位符号位,8位Exponent指数位,23位是Mantissa小数位。
存储后读取的值是 2^exponent*mantissa。
输入的是999999.99, mantissa保存的是1.90734863281257611392,这是把999999.99转化成二进制后,科学计数法的有效数字保存格式。然后Exponent = 146,实际上是146-127 = 19。显示成146是因为保存的是移码。
那么经过计算,1.9073486328125*2^19= 1,000,000.00000004。保存二位小数就是1,000,000.00。
用double同样道理有误差,只是double是双精度,要更大的数字才能测试出误差。由于我们系统正常使用不会超过那个数字,所以就不考虑。另外,对数字计算要求精确的话,请用decimal

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值