首页 文章

VBA舍入问题

提问于
浏览
6

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

a = 61048.4599674847
b = 154553063.208822
c = a + b   
debug.print c
Result: 
154614111.66879

这是一个问题,为什么VBA取代了变量c?我没有发出任何舍入功能 . 我期待的 Value 是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

2 回答

  • 3

    原因是可以存储在浮点变量中的有限精度 .
    有关完整的解释,请阅读1991年3月出版的计算机调查中发表的David Goldberg撰写的论文“每个计算机科学家应该知道的关于浮点算术的内容” .

    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
    
  • 11

    它并不晦涩,但不一定是显而易见的 .

    我认为你有点回答它 - 但基本问题是值的“大小”之一,即在给定类型的变量中可以存储多少数据 .

    如果(这是非常粗糙的)你计算你的第一个例子中每个数字的位数,你会看到你有15个,所以浮点数(默认类型)可以表示的值范围是巨大的精度限制为15位数(我相信有人会纠正这个,我会勾选维基盒...)

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

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

相关问题