Vb6 变量被设置为错误的值

Vb6 变量被设置为错误的值,vb6,Vb6,我遇到了一个问题,我的函数中的计算被关闭了。我正在使用VB6,这可能是我的第一个问题。发生的事情是我在循环中迭代,从一个变量到另一个变量,由一个变量步进,计算每个项目的折扣。它将每个计算出的折扣放入文本文件查找表中。如果用户提供的值介于这两个值之间,则该值为其应用的折扣 问题在于如何计算出折扣值。假设我每一步每单位折扣0.04美元。因此,第一步的折扣是.04,然后是.08,然后是.12,以此类推。为了计算这个值,它计算通过指定范围的步骤数,然后将步骤数乘以每步折扣值。这是主要问题。当我这样做时,

我遇到了一个问题,我的函数中的计算被关闭了。我正在使用VB6,这可能是我的第一个问题。发生的事情是我在循环中迭代,从一个变量到另一个变量,由一个变量步进,计算每个项目的折扣。它将每个计算出的折扣放入文本文件查找表中。如果用户提供的值介于这两个值之间,则该值为其应用的折扣

问题在于如何计算出折扣值。假设我每一步每单位折扣0.04美元。因此,第一步的折扣是.04,然后是.08,然后是.12,以此类推。为了计算这个值,它计算通过指定范围的步骤数,然后将步骤数乘以每步折扣值。这是主要问题。当我这样做时,我会得到一个浮点舍入误差。我将总步骤(1)乘以总折扣(.04),得到.039999999999

这不是一个大问题,但因为它计算了多次,并在计算中加入了计算,我不能有这样的精度损失,它会在以后的过程中偏离我的值。如何避免这种舍入错误? 另外值得注意的是,我分配的值是double和single,这可能是问题的原因吗


TL;由于某种原因,VB6中的DR:1*.0.04=.039999999999。即使我指定一个浮点变量=15.1,它也会变成=15.1000003814697。如何解决这个问题?

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

Dim decValue As Decimal
decValue = 1.536
相反,通过变量类型支持Decimal,例如

Dim vdecValue As Variant
vdecValue = CDec (1.536)
好处是你能得到你想要的精度。缺点是每个值占用14个字节,而不是4或8个字节。您还限于接受变量/小数的函数


很遗憾,您没有提供算法。你很有可能提前解决取整问题。例如,如果您的折扣在已知范围内,且精度已知,例如0.11到0.95,则您可以将总折扣记录为整值的百分之一百。将百分之一百的值相加为整数值/长数值,并仅在最后一个可能的点转换为单数值/双数值。显然,这只在你不需要一个运行总数的情况下起作用。讽刺的是,这个“假定小数点”正是VB表示货币和十进制值的方式。

尝试使用十进制数据类型,而不是双精度或单精度。而且,在任何地方都要一致地使用它。我应该说,在计算中应该转换为十进制。例如:CDec(可变1)*CDec(可变2)