【问题标题】:VBA drops the decimal point when multiplying decimal with whole number将小数与整数相乘时,VBA会删除小数点
【发布时间】:2019-06-19 22:24:21
【问题描述】:

我有一个从 Access 表中检索价格金额的用户表单。价格可以是小数。要计算一条线的总价格,我必须将它乘以数量。

一个典型的例子是:

  • Price = 10.45
  • Quantity = 1

从逻辑上讲,我想要的是Tot = 10.45*1 = 10.45。但是 VBA 给了我1045 没有小数点。

我浏览了论坛并看到了一些建议(转换为小数、使用模数、声明双精度、单精度、浮点数……),但结果没有改变。

我使用的代码是这样的:

Me.lblPU = (rs!price - (rs!price  * (5 / 100)))
Me.lblPriceTot = (CDec(Me.lblPU) * CDec(Me.Qty))

lblPU 字段给出了正确的数字:10.45 但是lblPriceTot 字段结果是1045

我没有声明有关此字段的任何变量,因为它们实际上是从 Access 中检索的,因此不是由用户编码的。

提前感谢您的帮助!

【问题讨论】:

  • 如果 lblPU 真的是 10.45 并且数量真的是 1,很难看出这是怎么发生的
  • 如果您使用点作为千位分隔符,那么通常 10.45 表示 1045。代替字符串使用数字或根据区域设置使用正确的小数分隔符。
  • 如果区域设置使用逗号,那么他的标签将显示 10,45 但它显示 10.45 所以逗号可能不是问题。
  • 检查 Excel 选项的值->高级->使用系统分隔符.. 似乎没有勾选。
  • 嗨@TimWilliams,变量rs!Price = 11。字段lblPU 的值是通过获得rs!Price 5% 的折扣来获得的。在这种情况下,整数 (11) 乘以小数 (5%),结果与小数 (10.45) 是正确的。但是,当在下面的行 (10.45*1) 上发生相同类型的计算时,结果将不带小数点。抱歉回复晚了,时差

标签: vba ms-access decimal modulus


【解决方案1】:

在 cmets 中写这将是一团糟。不用将字符串解析为小数,直接使用十进制值:

Me.lblPU = (rs!price - (rs!price  * (5 / 100)))
Me.lblPriceTot = ((rs!price - (rs!price  * (5 / 100))) * CDec(Me.Qty))

或者:

dim price as decimal = (rs!price - (rs!price  * (5 / 100)))
Me.lblPU = price
Me.lblPriceTot = (price * CDec(Me.Qty))

【讨论】:

  • 哇太棒了!非常感谢塞廷!第一个选项效果很好
【解决方案2】:

如果 Me.lblPU 返回数值的字符串表示形式,其中小数点使用逗号表示(可能是由于区域设置),则 CDec 将返回 1045 而不是 10.45,请注意:

?CDec("10.45")
 10.45 
?CDec("10,45")
 1045 

我建议避免任何潜在的字符串转换并直接使用数值,例如:

Me.lblPriceTot = 0.95 * rs!price * CDec(Me.Qty)

与数量字段类似,使用rs!quantity(如果存在)。

【讨论】:

  • 你们也可以提供解决方案吗?我知道如果他改变他的格式它会起作用,但我很想知道他如何在不进行数学运算等的情况下做到这一点?
  • 嗨,Lee,问题是我无法控制 lblPU 的值。它是一个变量,所以我不能在我的程序中对其进行硬编码
  • @BrunoBukavuThai Cetin 的回答与我的基本相同。
【解决方案3】:

首先,将字段命名为标签非常令人困惑。

然后,使用一个变量来缩短它:

Dim TruePrice As Currency

TruePrice = price * (1 - 5 / 100)
Me!lblPU.Value = TruePrice
Me!lblPriceTot.Value = TruePrice * Me!Qty.Value

【讨论】:

    猜你喜欢
    • 2019-01-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-13
    • 2017-10-28
    • 1970-01-01
    相关资源
    最近更新 更多