Мне нужно обрезать количество десятичных знаков моего двойного значения для отображения в текстовом поле. Как можно добиться этого с помощью vba?
Усечение Double с VBA в Excel
Ответы (5)
Вы можете использовать ROUND
для FORMAT
в VBA
Например, чтобы показать 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
Если вы хотите округлить значение, вы можете использовать функцию Round (но имейте в виду, что функция Round VBA использует округление Banker, также известное как округление до четного, где она округляет 5 в большую сторону). или вниз; для округления с использованием традиционного округления используйте Format).
Если вы хотите обрезать значение без округления, тогда нет необходимости использовать строки, как в принятом ответе - просто используйте математику:
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».
Вы можете использовать функцию 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
Это была моя попытка:
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
Надеюсь, эти функции кому-то пригодятся. Я не проводил обширных тестов, но они работали для меня.
ОТРЕДАКТИРОВАНО
В более новой версии Excel (VBA) есть функция TRUNC, которая уже работает правильно.
Для более старых версий EXCEL
Я хотел обрезать двойное число до целого числа.
value = Int(83.768)
value == 83
Круто, сработало.
В зависимости от вашей версии Excel (VB) это может не работать с отрицательными числами.
value = Int(-83.768)
value == -84
VB использует округление Banker.
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
Если вы хотите, чтобы определенные десятичные разряды делали то же, что Маках, только с 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
sign = Abs(value) / value
за один шаг: Sgn(value)
.
- person vpprof; 09.08.2020