同样可以作为浮点运算的数据类型:Currency、Double、Variant,但是却存在着一个致命的差异,Double、Variant虽然可以作为浮点型数据然而在小数位数比较大的时候却会出现计算结果错误的情况。如果我们使用Double、Variant类型的变量来存储浮点数,在进行如下运算的时候就会出现让人哭笑不得的结果:
源代码我就不写出来了,只把debug的内容弄出来。
ASj(j, k) - ASj(i - 1, k) * ASj(j, k) / zASj( i - 1, k) = ASj( 5 , 3 ) - ASj( 3 , 3 ) * ASj( 5 , 3 ) / ASj( 3 , 3 )=-28.0949824224992 - 48.0471540428252 *-28.0949824224992 / 48.0471540428252 =-3.5527136788005E-15 上面的数据虽然小数点后面有一长串数字但是计算非常简单,其结果为0!然而计算的结果却为-3.5527136788005E-15,这就是Double、Variant所会产生的错误,然而如果我们用的数据类型是Currency那么就可以成功的得到0的结果! 至于原因我不知道,写这个帖子主要就是提醒各位同僚能借我前车之鉴,不要搞大头都找不到问题所在!一旦会出现位数较高的浮点数最好还是使用Currency!
希望哪位大侠有空的时候补充一下这个帖子讲讲造成这种差异的原因。
源代码我就不写出来了,只把debug的内容弄出来。
ASj(j, k) - ASj(i - 1, k) * ASj(j, k) / zASj( i - 1, k) = ASj( 5 , 3 ) - ASj( 3 , 3 ) * ASj( 5 , 3 ) / ASj( 3 , 3 )=-28.0949824224992 - 48.0471540428252 *-28.0949824224992 / 48.0471540428252 =-3.5527136788005E-15 上面的数据虽然小数点后面有一长串数字但是计算非常简单,其结果为0!然而计算的结果却为-3.5527136788005E-15,这就是Double、Variant所会产生的错误,然而如果我们用的数据类型是Currency那么就可以成功的得到0的结果! 至于原因我不知道,写这个帖子主要就是提醒各位同僚能借我前车之鉴,不要搞大头都找不到问题所在!一旦会出现位数较高的浮点数最好还是使用Currency!
希望哪位大侠有空的时候补充一下这个帖子讲讲造成这种差异的原因。
解决方案 »
- 求助,关于MDi的缩放问题,谢谢
- 周六共乐,继续散分!没看到莫大小姐,还真有点想她
- 如果获取EXCEL表格中的有效行数和列数, 有请高手达人相助. 稍微有点急,帮顶有分
- chr(29)chr(30)chr(31)这些是什么字符?print 和 picture1.print显示还不一样?
- 关于oracle的addnew问题,大家看看
- 求自动创建ADSL连接的VB代码..用于部署xp系统安装
- VB 知道网卡名称如何获取相应本地连接的名称???
- 在VB中如何用TreeView对Access数据库进行排序?
- 上次问题提错了,是十进制转十六进制需要怎么做呀,还有就是如何让win2K关机,看过别人写过的文章,不过没懂:D
- 在VB下实现打印除了DataReport(数据报表)和Printer对象之外,还有没有更好的方法?
- VB调用外部可执行程序
- 在vb里做了一个水晶报表,运行时CrystalReportViewer总显示“登陆失败”
Private Sub Command1_Click()
Dim sj(4) As Double
sj(0) = -28.0949824224992
sj(1) = 48.0471540428252
sj(2) = -28.0949824224992
sj(3) = 48.0471540428252 '= -3.5527136788005E-15
sj(4) = sj(0) - sj(1) * sj(2) / sj(3)
Debug.Print sj(4)
End Sub结果是:-3.5527136788005E-15
如果变量包含小数,则可将它们声明为 Single、Double 或 Currency 变量。Currency 数据类型支持小数点右面 4 位和小数点左面 15 位;它是一个精确的定点数据类型,适用于货币计算。浮点(Single 和 Double)数比 Currency 的有效范围大得多,但有可能产生小的进位误差。
参见:http://blog.csdn.net/chinayuppie/archive/2009/06/15/4269754.aspx
同理,用二进制小数也不能精确表示某些10进制小数。Single
(单精度浮点型) 4 个字节 负数时从 -3.402823E38 到 -1.401298E-45;正数时从 1.401298E-45 到 3.402823E38
Double
(双精度浮点型) 8 个字节 负数时从 -1.79769313486232E308 到
-4.94065645841247E-324;正数时从4.94065645841247E-324 到 1.79769313486232E308
Currency
(变比整型) 8 个字节 从 -922,337,203,685,477.5808 到 922,337,203,685,477.5807
Decimal 14 个字节 没有小数点时为 +/-79,228,162,514,264,337,593,543,950,335,而小数点右边有 28 位数时为 +/-7.9228162514264337593543950335;最小的非零值为 +/-0.0000000000000000000000000001
Variant
(数字) 16 个字节 任何数字值,最大可达 Double 的范围