变量设置为错误的值

时间:2014-04-01 13:32:35

标签: vb6

我的计算器在我的功能中出现问题。我正在使用VB6,这可能是我的第一个问题。发生了什么事情我正在迭代一个循环,从一个变量走到另一个变量,踩一个变量,计算一个项目的每个折扣。它将每个计算的折扣放在文本文件查找表中。如果用户提供的值在这两个值之间,那就是它适用的折扣。

问题在于计算折扣价值。假设我每步每单位折扣0.04美元。所以第一步的折扣是.04,然后是.08,然后是.12等。为了计算这个,它计算经过指定范围的步数,然后将步数乘以每步折扣值。这是主要问题。当我这样做时,我得到一个浮点舍入错误。我将总步数(1)乘以总折扣(.04)并得到.03999999999999999。

这不是一个大问题,但是因为它多次计算出来并将计算结果添加到计算中我不会有这种精度损失,它会在以后抛弃我的值。如何避免这种舍入错误? 另外值得注意的是,我指定的值是双打和单打,这可能是问题的原因吗?

TL; DR:1 * .04 = .03999999999999在VB6中出于某种原因。即使我指定浮点变量= 15.1,它也变为= 15.1000003814697。我该如何解决这个问题?

1 个答案:

答案 0 :(得分:1)

浮点值类型(Single和Double)都有这个问题,因为它们在内存中表示为两部分:尾数和指数。如果需要类似整数的精度,则必须使用Decimal子类型。 VB6不直接支持这种类型。例如,你不能写:

Dim decValue As Decimal
decValue = 1.536

相反,通过Variant类型支持Decimal,例如

Dim vdecValue As Variant
vdecValue = CDec (1.536)

好处是你得到你想要的精度。缺点是每个值占用14个字节而不是4或8.您还可以使用接受Variant / Decimals的函数。

遗憾的是,您还没有提供算法。您很可能预先解决舍入问题。例如,如果您的折扣在已知范围内,并且已知精度(例如0.11到0.95),则可以将总折扣跟踪为整数值的百分之一。你总计百分之一的整数/长值,并且只在最后一个可能点转换为单/双。显然,这只有在您不需要总计时才有效。具有讽刺意味的是,这个“假定小数点”正是VB代表货币和十进制值的方式。