【问题标题】:Incorrect value for double calculation in vb6vb6中双重计算的值不正确
【发布时间】:2022-01-07 06:52:04
【问题描述】:

在 vb6 中添加 2 个值时,我得到了一些奇怪的行为。

当在即时窗口中为不同的情况打印变量 sum(double 类型)时,如下所示。

我得到的结果是:

sum =0                      sum =0                      sum =0 
sum =74.46+0.41             sum = 74.87                 sum=97.8+0.41
?sum                        ?sum =74.87                 ?sum
74.87                       TRUE                        98.21
?sum =74.87                                             sum=98.21
FALSE                                                   TRUE

当在 vb.net 中检查相同时,我们得到如下结果:

sum =0                      sum =0                      sum =0  
?sum                        sum = 74.87                 sum=97.8+0.41   
0                           ?sum =74.87                 ?sum    
sum =74.46+0.41             TRUE                        98.21   
?sum                                                    ?sum=98.21  
74.8699999999999                                        TRUE

从上面的结果我们可以说结果“False”,因为在 vb6 中该值等于 74.8699999999999。

  1. 那为什么在 vb6 结果显示为 74.87?
  2. 在 vb.net 案例中的预期值 =74.87 但实际值​​ =74.8699999999999 为什么会出现错误仅针对某些值?
  3. 发生这种行为 价值观?

【问题讨论】:

  • 浮点变量(vb6 中的单双数据类型)只是近似值,因为它们在内部是如何表示的。这里没有错误,这可能是浮点运算的预期行为。 vb.net(和 c++、c# 等)也会发生同样的情况,尽管您在这里的特定测试值显然没有这样做,但可能是运行时之间的舍入行为。
  • MarkL 所暗示的根本问题是浮点是 binary 分数,因此只有对应于 2 的分数幂(如 0.5、0.25)的十进制分数可以是准确地表示。 7.446e1 和 4.1e-1 都没有小数部分,它是 2 的小数幂,因此两者都是近似的,当您将它们相加时,最低有效位可能最终会有所不同(由于为每个加数选择了近似值) 比直接指定 74.87 时得到的结果。
  • 当您将浮点值转换为字符串时,运行时会尝试提供帮助并向您展示他们认为数字的含义,而不是它的确切含义(您不希望分配数字例如 0.41 打印为 0.410000000000003 ,这里是任意选择的错误,不一定是您在实践中看到的错误)。这就是为什么你可以得到两个不相等的数字仍然打印为“74.87”的原因。
  • 对此的规范参考包括“每个计算机科学家都应该了解的浮点知识”和 Bruce Dawson 关于浮点的帖子分组在这里:randomascii.wordpress.com/category/floating-point
  • 如果您只对两位小数感兴趣,请考虑在 VB6 中使用Currency 类型。对于 VB.NET,考虑这篇文章 (stackoverflow.com/questions/2256064/…) 似乎表明建议使用 Decimal

标签: vb.net vb6 double


【解决方案1】:

VB6 中的货币类型允许四位十进制数字,优于两位,但不如 .net 十进制多,并且比浮点数慢得多。至少是可以预测的:四位数字有时甚至不足以存储与货币相关的值,我必须以欧分几美分处理的一些单价需要更多位数。

总和 =0@
总和 =74.46@+0.41@
?sum
74.87
?sum =74.87@
是的

【讨论】:

    猜你喜欢
    • 2023-04-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-02
    • 2015-07-29
    • 2021-09-12
    相关资源
    最近更新 更多