Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/vba/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何确保带小数的数字在VBA中正好包含两个小数?_Vba_Excel - Fatal编程技术网

如何确保带小数的数字在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

这个问题与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)
不起作用。在输出中,数字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