VBA 舍入问题
Posted
技术标签:
【中文标题】VBA 舍入问题【英文标题】:VBA rounding problem 【发布时间】:2011-09-07 08:06:44 【问题描述】:我在 VBA 中有这个模糊的舍入问题。
a = 61048.4599674847
b = 154553063.208822
c = a + b
debug.print c
Result:
154614111.66879
问题来了,为什么 VBA 对变量 c 进行四舍五入?我没有发布任何四舍五入功能。我期望的值是 154614111.6687894847。即使我将变量 c 四舍五入或格式化为小数点后 15 位,我仍然没有得到预期的结果。
任何解释将不胜感激。
编辑:
使用 cDec 获得了预期的结果。我在 Jonathan Allen 在Why does CLng produce different results?的回复中读到了这一点
这是测试结果:
a = cDec(61048.4599674847)
b = cDec(154553063.208822)
c = a + b
?c
154614111.6687894847
【问题讨论】:
Floating-point arithmetic may give inaccurate results in Excel 【参考方案1】:原因是可以存储在浮点变量中的精度有限。 要获得完整的解释,您应该阅读 David Goldberg 发表在 1991 年 3 月的 Computing Surveys 上的论文What Every Computer Scientist Should Know About Floating-Point Arithmetic。
Link to paper
在 VBA 中,默认浮点类型是 Double
,它是一个 IEEE 64 位(8 字节)浮点数。
还有另一种可用类型:Decimal
,它是一个 96 位(12 字节)有符号整数,按 10 的可变幂进行缩放
简而言之,这提供了 28 位精度的浮点数。
在您的示例中使用:
a = CDec(61048.4599674847)
b = CDec(154553063.208822)
c = a + b
debug.print c
Result:
154614111.6687894847
【讨论】:
【参考方案2】:它并不晦涩,但不一定很明显。
我认为您已经回答了这个问题 - 但基本问题是值的“大小”之一,即在给定类型的变量中可以存储多少数据。
如果(这是非常粗略的)您计算第一个示例中每个数字的位数,您将看到您有 15 个,因此浮点数(默认类型)可以表示的值范围是巨大的精度限制在 15 位(我相信有人会纠正这个问题,我会在 wiki 框中打勾...)
因此,当您将两个数字相加时,它会丢失最不重要的值,以便保持在流的允许精度范围内。
通过执行 cDec,您将转换为具有更高精度的不同类型的变量(十进制)
【讨论】:
以上是关于VBA 舍入问题的主要内容,如果未能解决你的问题,请参考以下文章