15

我需要截断双精度值的小数位数以显示在文本框中。如何使用 vba 实现这一目标?

4

6 回答 6

14

如果要对值进行四舍五入,则可以使用 Round 函数(但请注意,VBA 的 Round 函数使用 Banker 的舍入,也称为舍入到偶数,它将向上或向下舍入 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”。

于 2014-11-20T09:52:37.207 回答
13

您可以ROUNDFORMATVBA中使用

例如显示 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
于 2012-07-05T15:37:56.317 回答
9

您可以使用 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

于 2015-03-23T17:17:58.820 回答
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

它使用字符串来避免由不同舍入方法引起的任何数学错误。它将作为双精度类型输出,因此您仍然可以对其进行自己的数学运算。

如果将没有小数位的数字传递给上述函数,这将导致错误。如果这是一个问题,您可以使用以下代码:

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

希望这些功能对某人有用。我没有进行广泛的测试,但它们对我有用。

于 2021-03-21T08:55:33.047 回答
0

这是我做的一个小实验......(第一次发布和回答,如果我不遵守约定,请告诉我。

Sub Truncate()
    
Dim dblNum  As Double
Dim intDecimal  As Integer

dblNum = 1578.56789
intDecimal = 2  '0 returns 1578
                '2 returns 1578.56
                '-2 returns 1500

Debug.Print (Int(dblNum * 10 ^ intDecimal) / 10 ^ intDecimal)

End Sub
于 2021-12-19T00:49:00.487 回答
-1

已编辑

较新版本的 Excel (VBA) 有一个 TRUNC 函数,它已经可以正常工作。

对于旧版本的 EXCEL

我想将双精度截断为整数。

value = Int(83.768)
value == 83

太棒了,它奏效了。

根据您的 Excel (VB) 版本,这可能不适用于负数。

value = Int(-83.768)
value == -84

VB 使用银行家四舍五入。

Public Function Trunc1(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
  Trunc1 = Sgn(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
    Trunc2 = Sgn(value) * (Int(Abs(value) * (10 ^ num)) / (10 ^ num))
End Function
于 2017-11-21T13:06:53.370 回答