如何确保带小数的数字在VBA中正好包含两个小数?
这个问题与VBA中的编程有关 我正在使用的数据类型是如何确保带小数的数字在VBA中正好包含两个小数?,vba,excel,Vba,Excel,这个问题与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
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)
不起作用。在输出中,数字1中剩下的小数仍然远远超过2位
对于这个问题,是否有一个简单的预构建库解决方案?或者我应该制定一个自定义方法来设置数字格式?构建自定义方法的推荐方法是什么?如果需要使用十进制类型,可以声明为变量并进行转换
Dim d As Variant
d = CDec(3.14)
不过,我猜,你的代码片段并没有错……也许
在我看来,调用此函数后,您正在从双精度转换为其他需要集中精力的东西,而不是在该函数内部。在下面的示例中,您可以看到round()
函数或其他类似函数之后,Number1
中只剩下2位小数
试验
所以您的代码应该可以正常工作,问题一定在其他地方(例如在单元格格式中)。您想将数字截断到小数点后2位还是将其四舍五入到小数点后2位?12.347可以是12.34或12.35。我想在输出中将其四舍五入到小数点后2位。如果舍入是不可行的,那么我可以接受truncate作为第二个选项。
CCur
类型转换函数将为您提供4位小数(在第4位舍入到高位或低位),但我不知道有哪一位将为您提供2位小数。您不能直接使用decimal
,但是您可以使用CDec
将一个Decimal
存储到变量中。您可以做的是,强制存储数字的范围仅显示2位小数,如:range(“A1”)。NumberFormat=“0.00”我可能是错的,但我相信最初发布的代码可以工作到小数点后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