В некоторых других ответах, прилагаемых к этому вопросу, предлагается преобразовать число в строку, а затем использовать символьную позицию «точки» в качестве индикатора числа десятичных знаков. Но это не надежный способ сделать это и приведет к крайне неточным ответам, если число будет иметь много десятичных разрядов, а его преобразование в строку содержит экспоненциальную запись.
Например, для уравнения 1/11111111111111111 (один разделен на 17), преобразование строки - «9E-17», что означает, что в результате получается 5, когда оно должно быть 17. Можно, конечно, извлечь правильный ответ с конца строки, когда присутствует «E-», но зачем все это делать, если вместо этого это можно сделать математически?
Вот функция, которую я только что приготовил для этого. Это не идеальное решение, и я не проверил его полностью, но, похоже, оно работает.
Public Function CountOfDecimalPlaces(ByVal inputNumber As Variant) As Integer
'
' This function returns the count of deciml places in a number using simple math and a loop. The
' input variable is of the Variant data type, so this function is versatile enougfh to work with
' any type of input number.
'
CountOfDecimalPlaces = 0 'assign a default value of zero
inputNumber = VBA.CDec(inputNumber) 'convert to Decimal for more working space
inputNumber = inputNumber - VBA.Fix(inputNumber) 'discard the digits left of the decimal
Do While inputNumber <> VBA.Int(inputNumber) 'when input = Int(input), it's done
CountOfDecimalPlaces = CountOfDecimalPlaces + 1 'do the counting
inputNumber = inputNumber * 10 'move the decimal one place to the right
Loop 'repeat until no decimal places left
End Function