作者: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. 空格在Html中的表示方法(&nbsp含义)

    转自:http://www.cnblogs.com/hailexuexi/archive/2010/07/25/1784611.html 在web开发经常会遇到如:   这样的字符.它其实是Html将 ...

  2. 细说java中Map的两种迭代方式

    曾经对java中迭代方式总是迷迷糊糊的,今天总算弄懂了.特意的总结了一下.基本是算是理解透彻了. 1.再说Map之前先说下Iterator: Iterator主要用于遍历(即迭代訪问)Collecti ...

  3. shell常用调试方法

    检查语法 -n选项只做语法检查,而不执行脚本. sh -n script_name.sh 启动调试 sh -x script_name.s 进入调试模式后,Shell依次执行读入的语句,产生的输出中有 ...

  4. 87. 再谈变体型Variant

    在85. BASIC和LotusScript中的Variant一文中.我提到了BASIC风格的语言中的变体型Variant.由于下述种种原因.在LotusScript中常常要用到变体型. 1.     ...

  5. ubuntu环境下android开发环境安装

    http://blog.csdn.net/shulianghan/article/details/38023959 Android程序开发的环境配置 Ubuntu下自带openjdk的卸载 你无需管它 ...

  6. iOS类方法实例方法 与 self

    Objective-C里面既有实例方法也类方法.类方法(Class Method) 有时被称为工厂方法(Factory Method)或者方便方法(Convenience method).工厂方法的称 ...

  7. 使用Nginx Upstream 部署 OpenERP

    Openerp 6.1 使用werkzeug 作为web服务的框架,性能比之前的cherrypy 有了很大的改善.但无论是 werkzeug 还是cherrypy ,都不是专门的web服务器.通常的做 ...

  8. EXCEPTION-IBATIS

      CreateTime--2016年8月23日08:44:03Author:Marydonibatis的sqlMap的xml文件配置出现的异常信息及解决方案 声明:异常类文章主要是记录了我遇到的异常 ...

  9. javascript 跳出(终止)forEach循环

      javascript 跳出(终止)forEach循环 CreateTime--2018年4月23日17:58:12 Author:Marydon 报错信息: 解决方案: javascript 跳出 ...

  10. KnockoutJS + My97DatePicker

    如何将Knockoutjs和其他脚本库结合使用?这里给出一个Knockoutjs与my97datepicker配合使用的例子,例子中使用了ko的自定义绑定功能: ko.bindingHandlers. ...