#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