Десятичные разряды в числе в VB.NET

#vb.net #decimal

#vb.net #десятичная

Вопрос:

Как мне проверить, сколько знаков после запятой имеет число в VB.NET ?

Например: внутри цикла у меня есть if оператор, и в этом операторе я хочу проверить, имеет ли число четыре десятичных знака (8.9659).

Комментарии:

1. Что такое a cicle ? Вы имеете в виду цикл? Какой тип данных вы используете?

2. Деннис только что дал мне несколько идей по ее решению! в любом случае спасибо! и да, я меняю цикл 🙂

Ответ №1:

Аналогичный подход, который учитывает целочисленные значения.

 Public Function NumberOfDecimalPlaces(ByVal number As Double) As Integer
    Dim numberAsString As String = number.ToString()
    Dim indexOfDecimalPoint As Integer = numberAsString.IndexOf(".")

    If indexOfDecimalPoint = -1 Then ' No decimal point in number
        Return 0
    Else
        Return numberAsString.Substring(indexOfDecimalPoint   1).Length
    End If

End Function
 

Ответ №2:

 Dim numberAsString As String = myNumber.ToString()
Dim indexOfDecimalPoint As Integer = numberAsString.IndexOf(".")
Dim numberOfDecimals As Integer = _
    numberAsString.Substring(indexOfDecimalPoint   1).Length
 

Комментарии:

1. Это не очень хороший способ сделать это и приведет к крайне неточным ответам, если число имеет много цифр справа от десятичной дроби, а его преобразование в строку содержит экспоненциальную нотацию. Попробуйте приведенный выше код со следующим уравнением деления: (1/111111111111111111). Преобразование строки равно «9E-17», что означает, что результирующий ответ равен 5, когда он должен быть 17. Конечно, можно было бы извлечь правильный ответ из конца строки, когда присутствует «E-«, но зачем все это делать, когда вместо этого это можно сделать математически? Я опубликую некоторый код в ответе, прикрепленном к этому вопросу.

Ответ №3:

   Public Shared Function IsInSignificantDigits(val As Double, sigDigits As Integer)
    Dim intVal As Double = val * 10 ^ sigDigits
    Return intVal = Int(intVal)
   End Function
 

Комментарии:

1. Было бы неплохо добавить некоторые комментарии или пояснения вместо предоставления ответа только для кода.

Ответ №4:

Для глобализации …

 Public Function NumberOfDecimalPlaces(ByVal number As Double) As Integer
    Dim numberAsString As String = number.ToString(System.Globalization.CultureInfo.InvariantCulture)
    Dim indexOfDecimalPoint As Integer = numberAsString.IndexOf(".")

    If (indexOfDecimalPoint = -1) Then ' No decimal point in number
        Return 0
    Else
        Return numberAsString.Substring(indexOfDecimalPoint   1).Length
    End If

End Function
 

Ответ №5:

Некоторые из других ответов, приложенных к этому вопросу, предлагают преобразовать число в строку, а затем использовать символьную позицию «точки» в качестве индикатора количества знаков после запятой. Но это ненадежный способ сделать это и приведет к крайне неточным ответам, если число имеет много десятичных знаков, а его преобразование в строку содержит экспоненциальную нотацию.

Например, для уравнения 1/111111111111111111 (единица, разделенная на 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
 

Ответ №6:

Просто … где n — количество цифр

 Dim n as integer = 2
Dim d as decimal = 100.123456
d = Math.Round(d, n);
MessageBox.Show(d.ToString())
 

ответ: 100.12