啊?不是吧,计算机进行小数运算时出错的原因竟然是……

啥?不信

不信,你试试运行下面这段代码

        float sum = 0;
        int i;
        for(i = 1;i<=100;i++){
            sum+=0.1;
        }
        System.out.println(sum);

等等……容我掐指算一算,结果是不是:10.000002

okok,那么这是为什么呢,这还得从……盘古开天地开始说起,盘古抡起了他的大斧子将天地劈开之后,long time after 约翰·冯·诺依曼发明了计算机。计算机内部的所有信息都是以二进制数的形式来处理的,而有一些十进制的小数无法转换成二进制数。举个栗子:0.1。十进制数0.1转换成二进制后,会变成0.00011001100……(1100循环)这样的循环小数。这其实和我们无法用十进制数来表示1/3是一样的道理。so,计算机是无法处理无限循环的小数的。

计算机计算出错的原因之一是,采用浮点数来处理小数(另外,也有因“位溢出”而造成计算错误的情况)。作为程序的数据类型,不管是使用单精度浮点数还是双精度浮点数,都存在计算出错的可能性。

那么我们怎么处理这种情况呢?

1、如果程序对数据的精度要求不高的情况下,完全可以忽略这个问题

2、还可以将小数转换成整数来计算,然后再除以响应的倍数即可

3、采用BCD方法

 

那么问题又来了,BCD是啥?

       BCD码(Binary-Coded Decimal‎),用4位二进制数来表示1位十进制数中的0~9这10个数码,是一种二进制的数字编码形式,用二进制编码的十进制代码。BCD码这种编码形式利用了四个位元来储存一个十进制的数码,使二进制十进制之间的转换得以快捷的进行。这种编码技巧最常用于会计系统的设计里,因为会计制度经常需要对很长的数字串作准确的计算。相对于一般的浮点记数法,采用BCD码,既可保存数值的精确度,又可免去使计算机作浮点运算时所耗费的时间。此外,对于其他需要高精确度的计算,BCD编码亦很常用。

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值