作者:iamlaosong

数字有两种表达方式。一种是整数,一种是浮点数。浮点数是属于有理数中某特定子集的数的数字表示,在计算机中用以近似表示随意某个实数。详细的说,这个实数由一个整数或定点数(即尾数)乘以某个基数(计算机中一般是2)的整数次幂得到,这种表示方法相似于基数为10的科学计数法。

计算机中存储浮点数的方式决定了浮点数往往是个近似值,由于日常生活中我们用的是十进制。而计算机用的是二进制,二进制非常难精确的表达十进制的小数。这里不想讨论计算机是怎样存储浮点数的,那会是非常长的一篇枯燥文字,这里仅以实验来验证。请看以下程序:

Sub tt1()
For i = 0 To 1000 Step 0.1
Debug.Print i
Next
End Sub

执行上面你会发现,前面能够正确显示的数值。仅仅有一位小数,加到6以后,小数点后就暴增到了十几位,结果例如以下:

 。。


 5.3 
 5.4 
 5.5 
 5.6 
 5.7 
 5.8 
 5.9 
 6 
 6.1 
 6.19999999999999 
 6.29999999999999 
 6.39999999999999 
 6.49999999999999 
 6.59999999999999 
 6.69999999999999 

。。。

这就是浮点数的累积误差,由于计算机的二进制存储无法精确的存储0.1这个数字。把上述程序的步长换成0.125,再执行上述程序,则不再出现误差,这是由于二进制能够精确的存储0.125这个数字。

这种误差可能导致比較失误,比方上面的值。你认为应该等于6.2的,但实际值却是小于6.2。所以,在一些须要精确计算、精确比較的场合,最好不要用浮点数。假设原始数据是浮点数,能够先化成整数计算、比較,然后再还原成浮点数。比方上述程序能够写成例如以下:

Sub tt1()
For i = 0 To 1000 Step 1
Debug.Print i / 10
Next
End Sub

这样就能够避免浮点数计算造成的累积误差。此外,浮点数应尽量避免精确比較,一般採取大于、小于这种比較。以免产生逻辑错误。

【VBA研究】浮点数计算总是有误差的的更多相关文章

  1. Java浮点数float,bigdecimal和double精确计算的精度误差问题总结

    (转)Java浮点数float,bigdecimal和double精确计算的精度误差问题总结 1.float整数计算误差 案例:会员积分字段采用float类型,导致计算会员积分时,7位整数的数据计算结 ...

  2. js浮点数计算问题 + 金额大写转换

    一 js浮点数计算问题解决方案: 1.使用 NumberObject.toFixed(num) 方法 toFixed() 方法可把 Number 四舍五入为指定小数位数的数字. 2.较精度计算浮点数 ...

  3. 关于js浮点数计算精度不准确问题的解决办法

    今天在计算商品价格的时候再次遇到js浮点数计算出现误差的问题,以前就一直碰到这个问题,都是简单的使用tofixed方法进行处理一下,这对于一个程序员来说是及其不严谨的.因此在网上收集了一些处理浮点数精 ...

  4. 如何避开JavaScript浮点数计算精度问题(如0.1+0.2!==0.3)

    不知道大家在使用JS的过程中有没有发现某些浮点数运算的时候,得到的结果存在精度问题:比如0.1 + 0.2 = 0.30000000000000004以及7 * 0.8 = 5.60000000000 ...

  5. php浮点数计算比较及取整不准确解决方法

    原文:php浮点数计算比较及取整不准确解决方法 php有意思的现象,应该是很多编程语言都会有这样的现象.这个是因为计算机的本身对浮点数识别的问题..... $f = 0.58; var_dump(in ...

  6. jmeter 中 浮点数计算精度问题

    jmeter 中 浮点数计算精度问题解决方法: 编写 beanshell 时使用 java.math.BigDecimal 方法构造,使用 BigDecimal 并且一定要用 String 来够造. ...

  7. Vim技能修炼教程(16) - 浮点数计算函数

    浮点数计算函数 这一节的所有函数,只有在vim编译时支持了+float时才有效. 三角函数 sin() : sine正弦函数 cos() : cosine余弦函数 tan() : tangent正切函 ...

  8. 【VBA研究】如何用Base64 编解码方法实现简单的加解密

    Base64编码的思想是是采用64个基本的ASCII码字符对数据进行重新编码,将数据变成字符串实现文本传输.由于编码简单,所以很容易实现,代码也是现成的.利用这个编码规则可以实现简单的加解密.编解码方 ...

  9. php踩过的那些坑(5)浮点数计算

    一.前方有坑 php在使用加减乘除等运算符计算浮点数的时候,经常会出现意想不到的结果,特别是关于财务数据方面的计算,给不少工程师惹了很多的麻烦.比如今天工作终于到的一个案例: $a = 2586; $ ...

随机推荐

  1. 如何:使用TreeView控件实现树结构显示及快速查询

    本文主要讲述如何通过使用TreeView控件来实现树结构的显示,以及树节点的快速查找功能.并针对通用树结构的数据结构存储进行一定的分析和设计.通过文本能够了解如何存储层次结构的数据库设计,如何快速使用 ...

  2. SQL Server 附加数据库提示5120错误

    怎么样是不是跟你的错误是一样的,心里是不是有点小激动? T_T 终于有办法了!!!! 第一步先关掉你的SQLserver 然后在菜单上找找到SQLSERVER右键选择“以管理员运行” 第二步给你的数据 ...

  3. (C++)i++和++i,哪个效率高一些

    在看<程序员面试笔试宝典>时,发现了这样一个问题,书中只给出了++i的效率高一些,但并没有给出具体的解释和说明. 在网上找到下面的答案: 1.从高级层面上解释 ++i 是i=i+1,表达式 ...

  4. Discuz常见小问题-如何使用QQ登陆

    在首页中找到超链接 往下翻找到QQ互联,注意如果是内网无法开通(需要网站上传之后)

  5. Excel只能输入不许修改

        昨天出差,用户有个需求:需要他人录入数据,为了防止已经录入的数据被修改(录入数据由多方完成),必须限定只能输入,不能修改(修改时需要密码),最开始的方案是各设置一个密码,但如果他们相互之间联合 ...

  6. Java从零开始学三十三四(JAVA IO-流简述)

    一.流概念(stream) File类并不能对文件内容进行读写. 读文件就是指:把文件的内中的数据读取到内存中来 写文件就是指:把内存中的数据写入到文件中去. 通过什么读写文件呢?文件流. 1.1.流 ...

  7. 算法笔记_206:第五届蓝桥杯软件类决赛真题(Java语言A组)

    目录 1 海盗分金币 2 六角幻方 3 格子放鸡蛋 4 排列序数 5 幂一矩阵 6 供水设施    前言:以下代码仅供参考,若有错误欢迎指正哦~ 1 海盗分金币 有5个海盗,相约进行一次帆船比赛. 比 ...

  8. LeetCode 37 Count and Say

    The count-and-say sequence is the sequence of integers beginning as follows: 1, 11, 21, 1211, 111221 ...

  9. js-知识集锦

      CreateTime--2016年9月22日14:37:51Author:Marydonjs小知识点集锦1. JSON.stringify(Obj);//将Object对象转换成json格式的st ...

  10. EXCEPTION-javaBean

      CreateTime--2016年11月24日14:29:43Author:Marydon 声明:异常类文章主要是记录了我遇到的异常信息及解决方案,解决方案大部分都是百度解决的,(这里只是针对我遇 ...