我需要截断双值的小数位数,以便在文本框中显示。如何通过vba实现这一目标?
答案 0 :(得分:11)
您可以在VBA中使用ROUND
FORMAT
例如显示2位小数
Dval = 1.56789
Debug.Print Round(dVal,2)
Debug.Print Format(dVal,"0.00")
注意:以上内容会为您1.57
。因此,如果您正在寻找1.56
,那么您可以将Dval存储在字符串中,然后执行此操作
Dim strVal As String
dVal = 1.56789
strVal = dVal
If InStr(1, strVal, ".") Then
Debug.Print Split(strVal, ".")(0) & "." & Left(Split(strVal, ".")(1), 2)
Else
Debug.Print dVal
End If
答案 1 :(得分:9)
如果你想舍入值,那么你可以使用Round函数(但要注意VBA的Round函数使用Banker的舍入,也称为round-to-even,它将在其中舍入a 5向上或向下;使用传统舍入舍入,使用格式)。
如果你想截断值而不进行舍入,那么就不需要在接受的答案中使用字符串 - 只需使用数学:
Dim lDecimalPlaces As Long: lDecimalPlaces = 2
Dim dblValue As Double: dblValue = 2.345
Dim lScale = 10 ^ lDecimalPlaces
Dim dblTruncated As Double: dblTruncated = Fix(dblValue * lScale) / lScale
这产生“2.34”。
答案 2 :(得分:6)
您可以使用Int()函数。 Debug.print Int(1.99543)
或更好:
Public Function Trunc(ByVal value As Double, ByVal num As Integer) As Double
Trunc = Int(value * (10 ^ num)) / (10 ^ num)
End Function
所以你可以使用Trunc(1.99543, 4)
==> result: 1.9954
答案 3 :(得分:0)
这是我的尝试:
Function TruncateNumber(decimalNum As Double, decPlaces As Integer) As Double
'decimalNum: the input number to be truncated
'decPlaces: how many decimal places to round to. Use 0 for no decimal places.
decimalLocation = InStr(decimalNum, ".")
TruncateNumber = Left(decimalNum, decimalLocation + decPlaces)
End Function
它使用字符串来避免由不同的舍入方法引起的任何数学错误。它将输出为 double 类型,因此您仍然可以对其进行数学运算。
如果将一个没有小数位的数字传递给上述函数,这将导致错误。如果这是一个问题,您可以使用以下代码:
Function TruncateNumber(decimalNum As Double, decPlaces As Integer) As Double
'decimalNum: the input number to be truncated
'decPlaces: how many decimal places to round to. Use 0 for no decimal places.
If InStr(decimalNum, ".") = 0 Then 'if there was no decimal:
'then return the number that was given
TruncateNumber = decimalNum
Else 'if there is a decimal:
'then return the truncated value as a type double
decimalLocation = InStr(decimalNum, ".")
TruncateNumber = Left(decimalNum, decimalLocation + decPlaces)
End If
End Function
希望这些功能对某人有用。我还没有进行大量测试,但它们对我有用。
答案 4 :(得分:-1)
如此有趣的故事。我正在搞乱VB转换功能。我只想将一个double截断为一个整数。
value = Int(83.768)
value == 83
太棒了,VB中的东西确实有效。
哎呀,我忘了它不能用负数
value = Int(-83.768)
value == -84
...是的,刚刚发生了。 VB使用Banker舍入。
Public Function Trunc(ByVal value As Double) As Integer
' Truncate by calling Int on the Absolute value then multiply by the sign of the value.
' Int cannot truncate doubles that are negative
Trunc = (Abs(value) / value) * Int(Abs(value))
End Function
如果你想要特定的小数位,请执行Makah在值周围使用Abs所做的事情,以便Int可以正确截断。
Public Function Trunc2(ByVal value As Double, Optional ByVal num As Integer = 1) As Double
' Truncate by calling Int on the Absolute value then multiply by the sign of the value.
' Int cannot truncate doubles that are negative
Dim sign As Integer
sign = Abs(value) / value
Trunc2 = sign * (Int(Abs(value) * (10 ^ num)) / (10 ^ num))
End Function