在excel中使用VBA截断Double

时间:2012-07-05 15:33:05

标签: excel-vba double decimal-point vba excel

我需要截断双值的小数位数,以便在文本框中显示。如何通过vba实现这一目标?

5 个答案:

答案 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