【问题标题】:How to make sure numbers with decimals contain exactly two decimals in VBA?如何确保带小数的数字在 VBA 中恰好包含两个小数?
【发布时间】:2015-11-16 19:57:46
【问题描述】:

这个问题涉及 VBA 编程

我使用的数据类型是Double,因为编译器无法识别数据类型Decimal。这是一个促成问题。

Private Number1 as Double
Number1 = (read from a data source which contains 2 decimals)
Number1 = 0.15 * Number1 '#client needs to have a 0.15 multiplier for Number1. This multiplication causes number format problems.
Number1 = Round(Number1, 2)
Number1 = formatNumber(Number1, 2)

不起作用。输出中的 Number1 中还剩下多于 2 位小数。

是否有一个简单的预建库解决方案来解决这个问题?还是我应该使用自定义方法来格式化数字?构建该自定义方法的推荐方法是什么?

【问题讨论】:

  • 您想将数字截断到小数点后 2 位还是舍入到小数点后 2 位? 12.347 可以是 12.34 或 12.35。
  • 我想将它四舍五入到输出的小数点后 2 位。如果舍入不可行,那么我可以接受 truncate 作为次要选项。
  • CCur 类型转换函数将为您提供 4 位小数(四舍五入到第 4 位的高位或低位),但我不知道有任何可以为您提供 2 位。
  • 您不能直接使用Decimal,但您可以使用CDecDecimal 存储到Variant 中。
  • 您可以做的是,强制您存储号码的范围仅显示 2 位小数,如下所示: Range("A1").NumberFormat = "0.00"

标签: vba excel


【解决方案1】:

在下面的示例中,您可以看到 Number1round() 函数或其他类似函数之后只剩下 2 个小数

Sub test()
    Dim Number1 As Double
    Dim FX As Object: Set FX = WorksheetFunction

    Number1 = 0.15 * 1.236:                                      Debug.Print Number1 'return 0.1854
    Number1 = 0.15 * 1.236: Number1 = Round(Number1, 2):         Debug.Print Number1 'return 0.19
    Number1 = 0.15 * 1.236: Number1 = FX.Round(Number1, 2):      Debug.Print Number1 'return 0.19
    Number1 = 0.15 * 1.236: Number1 = FX.RoundUp(Number1, 2):    Debug.Print Number1 'return 0.19
    Number1 = 0.15 * 1.236: Number1 = FX.RoundDown(Number1, 2):  Debug.Print Number1 'return 0.18
    Number1 = 0.15 * 1.236: Number1 = FX.Ceiling(Number1, 0.01): Debug.Print Number1 'return 0.19
    Number1 = 0.15 * 1.236: Number1 = FX.Floor(Number1, 0.01):   Debug.Print Number1 'return 0.18
End Sub

测试


所以你的代码应该可以正常工作,问题一定出在其他地方(例如单元格格式)。

【讨论】:

  • 我可能是错的,但我相信最初发布的代码确实有效到小数点后 2 位。我认为数据正在其他地方转换,因此怀疑是否有任何功能可以完成这项工作。没有代码很难说……也许吧。
  • 我认为您是对的,我的示例还表明代码一切正常,问题一定出在其他地方(例如单元格格式)。我将更新我的帖子以提供更多无法理解的表示,变量一切都很好
【解决方案2】:

如果需要使用十进制类型,可以声明为变体并进行转换。

Dim d As Variant
d = CDec(3.14)

不过,在我看来,你的代码 sn-p 没有错……也许……

在我看来,在调用此函数后,您正在从 double 转换为其他需要集中精力的东西 - 而不是在此函数内部。

【讨论】:

    猜你喜欢
    • 2013-07-03
    • 2012-05-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-03
    • 2013-08-06
    • 1970-01-01
    相关资源
    最近更新 更多