【VBA研究】浮点数计算总是有误差的
作者: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研究】浮点数计算总是有误差的的更多相关文章
- Java浮点数float,bigdecimal和double精确计算的精度误差问题总结
(转)Java浮点数float,bigdecimal和double精确计算的精度误差问题总结 1.float整数计算误差 案例:会员积分字段采用float类型,导致计算会员积分时,7位整数的数据计算结 ...
- js浮点数计算问题 + 金额大写转换
一 js浮点数计算问题解决方案: 1.使用 NumberObject.toFixed(num) 方法 toFixed() 方法可把 Number 四舍五入为指定小数位数的数字. 2.较精度计算浮点数 ...
- 关于js浮点数计算精度不准确问题的解决办法
今天在计算商品价格的时候再次遇到js浮点数计算出现误差的问题,以前就一直碰到这个问题,都是简单的使用tofixed方法进行处理一下,这对于一个程序员来说是及其不严谨的.因此在网上收集了一些处理浮点数精 ...
- 如何避开JavaScript浮点数计算精度问题(如0.1+0.2!==0.3)
不知道大家在使用JS的过程中有没有发现某些浮点数运算的时候,得到的结果存在精度问题:比如0.1 + 0.2 = 0.30000000000000004以及7 * 0.8 = 5.60000000000 ...
- php浮点数计算比较及取整不准确解决方法
原文:php浮点数计算比较及取整不准确解决方法 php有意思的现象,应该是很多编程语言都会有这样的现象.这个是因为计算机的本身对浮点数识别的问题..... $f = 0.58; var_dump(in ...
- jmeter 中 浮点数计算精度问题
jmeter 中 浮点数计算精度问题解决方法: 编写 beanshell 时使用 java.math.BigDecimal 方法构造,使用 BigDecimal 并且一定要用 String 来够造. ...
- Vim技能修炼教程(16) - 浮点数计算函数
浮点数计算函数 这一节的所有函数,只有在vim编译时支持了+float时才有效. 三角函数 sin() : sine正弦函数 cos() : cosine余弦函数 tan() : tangent正切函 ...
- 【VBA研究】如何用Base64 编解码方法实现简单的加解密
Base64编码的思想是是采用64个基本的ASCII码字符对数据进行重新编码,将数据变成字符串实现文本传输.由于编码简单,所以很容易实现,代码也是现成的.利用这个编码规则可以实现简单的加解密.编解码方 ...
- php踩过的那些坑(5)浮点数计算
一.前方有坑 php在使用加减乘除等运算符计算浮点数的时候,经常会出现意想不到的结果,特别是关于财务数据方面的计算,给不少工程师惹了很多的麻烦.比如今天工作终于到的一个案例: $a = 2586; $ ...
随机推荐
- 支持各种控件上/下拉刷新的android-pulltorefresh
android- pulltorefresh 一个强大的拉动刷新开源项目,支持各种控件下拉刷新,如ListView.ViewPager.WevView. ExpandableListView.Grid ...
- QQ2010如何开启透明效果皮肤
QQ2010可在WIN7下实现皮肤透明效果. 腾讯已于近日发布了QQ2010的BETA版本,经笔者试验,可在WIN7下实现皮肤透明化效果. 设置如下: 1.先打开QQ皮肤控制面板,如下: 2.然后任选 ...
- Android 之布局(一)
Android的布局类型: 主要有:LinearLayout(线性布局).RelativeLayout(相对布局).TableLayout(表格布局).AbsoluteLayout(绝对布局).Fra ...
- Android 之布局(二)
3.TableLayout(表格布局) 像表格一样布局,通常情况下,TableLayout有多个TableRow组成,每个TableRow就是一行. <?xml version="1. ...
- 简单分页查询(web基础学习笔记十三)
一.建立资源文件和工具类 1.1 .database.properties jdbc.driver_class=oracle.jdbc.driver.OracleDriver jdbc.connect ...
- jquery.dataTables动态列
jquery.dataTables 版本1.10.7 直接上代码: 0.table <table id="popReportTable"> <thead> ...
- 自我分析-Spring IOC
Spring IOC容器实现原理大致是容器(Map)+反射(Java反射和cglib).Spring提供丰富的ApplicationContext.以FileSystemXmlApplicationC ...
- cmd获取批处理文件所在路径
在批处理开头加入cd /d %~dp0 一行代码就真真实实地做到“编写一次,到处运行”.%0是批处理文件本身的路径,%~dp进行扩展, d向前扩展到驱动器,p往后扩展到路径.例如,你的bat文件在e: ...
- 〖Linux〗OK6410a蜂鸣器的驱动程序编写全程实录
最近在看一本书,受益匪浅,作者是李宁,下边是编写本次蜂鸣器的全程实录: 1. 了解开发板中的蜂鸣器 1) 查看蜂鸣器buzzer在底板中的管脚信息 2) 查看蜂鸣器在总线中的信息 3) 翻看S3C64 ...
- 中国城市线划分—Where do you want to develop......