Усечение Double с VBA в Excel

Мне нужно обрезать количество десятичных знаков моего двойного значения для отображения в текстовом поле. Как можно добиться этого с помощью vba?


person Ehudz    schedule 05.07.2012    source источник


Ответы (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
person Siddharth Rout    schedule 05.07.2012
comment
Никогда не обрабатывайте числа как текст. - person Gustav; 07.10.2020

Если вы хотите округлить значение, вы можете использовать функцию 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».

person Gary McGill    schedule 20.11.2014
comment
Я забыл об округлении Банкира. +1, несмотря на снисходительность, просто используйте математический удар. Для простого отображения числа в соответствии с запросом OP, если вам не очень важно округление, Format() является инструментом для задания и проще, чем Fix() (или Int(), что эквивалентно Fix() для положительных чисел). Однако бывают случаи, когда округление Banker вызовет вопросы у пользователей и потребует более сложного преобразования. - person GlennFromIowa; 10.02.2017

Вы можете использовать функцию 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

person Makah    schedule 23.03.2015

Это была моя попытка:

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

Надеюсь, эти функции кому-то пригодятся. Я не проводил обширных тестов, но они работали для меня.

person Zac    schedule 21.03.2021

ОТРЕДАКТИРОВАНО

В более новой версии 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
person justengel    schedule 21.11.2017
comment
Существует знаковая функция, которая достигает sign = Abs(value) / value за один шаг: Sgn(value). - person vpprof; 09.08.2020