Excel VBA舍入问题

Excel VBA舍入问题,excel,vba,Excel,Vba,我在VBA中有一个模糊的舍入问题 a = 61048.4599674847 b = 154553063.208822 c = a + b debug.print c Result: 154614111.66879 问题是,为什么VBA舍入了变量c?我没有发布任何舍入函数。我期望的值是154614111.6687894847。即使我将变量c四舍五入或格式化为15位小数,我仍然无法得到预期的结果 如有任何解释,将不胜感激 编辑: 使用cDec获得了预期的结果。我在乔纳森·艾伦的回信中读到

我在VBA中有一个模糊的舍入问题

a = 61048.4599674847
b = 154553063.208822
c = a + b   
debug.print c
Result: 
154614111.66879 
问题是,为什么VBA舍入了变量c?我没有发布任何舍入函数。我期望的值是154614111.6687894847。即使我将变量c四舍五入或格式化为15位小数,我仍然无法得到预期的结果

如有任何解释,将不胜感激

编辑:

使用cDec获得了预期的结果。我在乔纳森·艾伦的回信中读到了这一点

以下是测试结果:

a = cDec(61048.4599674847)
b = cDec(154553063.208822)
c = a + b
?c
154614111.6687894847 

原因是可存储在浮点变量中的有限精度。
要获得完整的解释,你应该阅读David Goldberg在1991年3月出版的《计算机调查》上发表的《每位计算机科学家都应该知道的浮点算术知识》一文

在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 

这并不晦涩,但也不一定显而易见

我想你已经回答了——但基本问题是值的“大小”,即给定类型的变量可以存储多少数据

如果(这是非常粗糙的)计算第一个示例中每个数字的位数,您将看到您有15个,因此,虽然浮点(默认类型)可以表示的值范围很大,但精度限制为15位(我相信会有人来纠正这一点,我将勾选wiki框…)

因此,当您将这两个数字相加时,它会丢失最低有效值,以便保持在流的允许精度范围内

通过执行cDec,您将转换为能够获得更高精度的不同类型的变量(十进制)