Как бы я получить число после десятичной точки в VB.NET

Может ли кто-нибудь дать мне простой способ узнать числа после десятичной точки двойного?
Все, что мне нужно сделать, это выяснить, заканчивается ли число в 0, как 1,0 или 10,0 или 323,0?

Есть ли у вас идеи по этому поводу?

 Chris18 мая 2012 г., 17:47
Правильно. Если вы смотрите на ввод данных, то, скорее всего, у вас есть строка. Просто сохраните эту строку и используйте проверки, указанные ниже, и, если это целое число, верните строку. Я не уверен, почему вы хотели бы сделать это, хотя. Обычно вы хотите отобразить стандартное количество десятичных знаков для всех чисел (например,ToString("N2")) или вы хотите вернуть номер в его простейшем виде (которыйToString() Я думаю, что обычно так и есть). Возможно, вы захотите отредактировать приведенный выше вопрос, чтобы было более понятно, с чего вы начинаете и чем хотите закончить.
 Chris18 мая 2012 г., 17:19
Вы в основном говорите, что хотите узнать, является ли двойное число целым числом или нет?
 AltF4_18 мая 2012 г., 17:13
ну, число, о котором идет речь, может быть 10.04, например, в этом случае оно меня не интересует .... ПРОСТО 0 после точки
 AltF4_18 мая 2012 г., 17:29
это правильно и хотите затем вернуть это число в виде строки. КАК ЭТО БЫЛО ВВЕДЕНО

Ответы на вопрос(8)

Решение Вопроса

double, single, integer, decimal), вы не можете представить 10.0 и 10 как два разных значения. Нет способа сделать это. Если вам нужно сохранить мантиссу числа, даже если она равна нулю, вам придется сохранить значение как некоторый другой тип данных, такой как строка.

Чтобы проверить введенную строку, вы можете сделать что-то вроде этого:

Public Function MantissaIsZero(ByVal value As String) As Boolean
    Dim result As Boolean = False
    Dim parts() As String = value.Split("."c)
    If parts.Length = 2 Then
        Dim mantissa As Integer = 0
        If Integer.TryParse(parts(1), mantissa) Then
            result = (mantissa = 0)
        End If
    End If
    Return result
End Function
 AltF4_18 мая 2012 г., 17:43
ОК ... любое другое предложение, кроме строки ... потому что это то, что разрушает число .... как насчет десятичной?
 18 мая 2012 г., 19:20
Это действительно ваша лучшая ставка. Если вам необходимо сохранить значение во временную переменную для преобразования, чтобы вы не потеряли двойное значение. С использованием любого типа числового типа данных, однако, невозможно получить разницу между 10 и 10,0, поскольку они имеют одинаковое число. Для строкового типа данных это абсолютно разные значения.
 18 мая 2012 г., 17:59
@AshShafiee Каким образом строковый тип данных разрушает число? Как сказал Крис, у вас будет та же проблема с любым числовым форматом. Если вам нужно точное число, лучше использовать десятичное число, а не тип данных с плавающей запятой, но это не похоже на то, что вас сейчас интересует.
 18 мая 2012 г., 17:56
@AshShafiee: любой числовой формат (двойной, одинарный, десятичный и т. Д.) Будет обрабатывать числа 10,0 и 10 одинаково. Единственный формат, который не выиграет, - это строка или аналогичный эквивалент. Очевидная причина в том, что разница между ними есть только в строке. Можете ли вы объяснить, почему вы думаете, что строка разрушает число или что вы подразумеваете под этим?

Function CalculateDecimals(input As Double)
  Dim positiveInput As Double
  positiveInput = Math.Abs(input)
  Return positiveInput - Math.Floor(positiveInput)
End Function

Это даст вам десятичные дроби, которые вы ищете.

Используйте это таким образом:

If (Math.Abs(CalculateDecimals(yourNumber))<0.00001) Then ...
 AltF4_18 мая 2012 г., 17:24
даже если у меня нет десятичных разрядов, которые по-прежнему возвращает истину ... что не очень хорошо

Я также использовал функцию мода, но вы должны быть осторожны с этим, так как есть прецизионные «проблемы». с типом данных "Double":

Dim numberDbl As Double = 1.2
Dim modValDbl As Double = 1.0
Dim remValDbl As Double = numberDbl Mod modValDbl
'remValDbl = 0.19999999999999996 -> not 100% precise

Dim numberDec As Decimal = 1.2D
Dim modValDec As Decimal = 1D
Dim remValDec As Decimal = numberDec Mod modValDec
'remValDec = 0.2 -> correct

Поэтому я написал эту функцию: (пример: число = 1,25)

I first take the parameter number and mod it with its own integer (1.25 mod 1) so I get the decimal value of my number and store it to remVal = 0.25 in the loop I keep multiplying remVal with 10 and compare this value with the same truncated value (i.e.: 2.5 <> 2) until they are the same with every loop I increment the multiplier by 10

as soon the two values match (i.e.: 25 = 25) I can return my decimal value using remVal and multiplier

Public Shared Function getDecimalPlaces(number As Double) As Double
Dim modVal As Integer = CInt(If(Math.Truncate(number) = 0, 1, Math.Truncate(number)))
Dim remVal As Decimal = CDec(number) Mod modVal
Dim retVal As Double = 0

Debug.WriteLine("modVal: " + modVal.ToString)
Debug.WriteLine("remVal: " + remVal.ToString)
Dim multiplier As Decimal = 1

While remVal * multiplier <> Math.Truncate(remVal * multiplier)
    Debug.WriteLine("remVal * multiplier <> Math.Truncate(remVal * multiplier): " + (remVal * multiplier).ToString + " <> " + (Math.Truncate(remVal * multiplier)).ToString)
    multiplier *= 10
    Debug.WriteLine("remVal * multiplier <> Math.Truncate(remVal * multiplier): " + (remVal * multiplier).ToString + " <> " + (Math.Truncate(remVal * multiplier)).ToString)
End While

retVal = CDbl(remVal * multiplier)

Debug.WriteLine("remVal: " + remVal.ToString)
Debug.WriteLine("multiplier: " + multiplier.ToString)
Debug.WriteLine("retVal: " + retVal.ToString)
Return retVal
End Function

'Output with number = 1.25
'modVal: 1
'remVal: 0,25
'remVal * multiplier <> Math.Truncate(remVal * multiplier): 0,25 <> 0 -> true
'remVal * multiplier <> Math.Truncate(remVal * multiplier): 2,50 <> 2 -> true
'remVal * multiplier <> Math.Truncate(remVal * multiplier): 2,50 <> 2 -> true
'remVal * multiplier <> Math.Truncate(remVal * multiplier): 25,00 <> 25 -> false: exit while
'remVal: 0,25
'multiplier: 100
'retVal: 25

Например. допустим, х = 10,2

temp = x * 10 ' температура равна 102

temp = temp% 10 ' это должно вернуть 2. Temp теперь значение десятичной дроби, которое вам нужно.

Это должно работать и для отрицательных значений.

Если вам нужно сравнить, чтобы увидеть, является ли это 0, все, что вам нужно сделать, это сравнить вашу временную переменную с 0.

 AltF4_18 мая 2012 г., 17:36
Мне нужно получить другой результат, если мой номер 10 или 10,0 ... у вас есть способ сделать это ???
 18 мая 2012 г., 17:46
Я предполагаю, что это число исходит из файла или текстового поля и зависит от того, как оно введено пользователем? Вы можете преобразовать десятичную строку в строку, а затем выполнить поиск для & apos;. & Apos; После этого установите bool так, чтобы, если есть десятичная дробь, используйте мой пример, если нет, используйте любое возвращаемое значение для целочисленного значения.

и вы хотите идентифицировать строки с десятичными знаками, но где все эти десятичные разряды равны нулю, вы можете использовать регулярное выражение:

var regex = new Regex("^-?\\d+\\.0+$");
if (new Regex.IsMatch(input))
{
    // it's in the format you want
}

Mod оператор, вот так:

If (x Mod 1) = 0 Then
    ' Do some stuff
End If

(увидетьhttp://en.wikibooks.org/wiki/Visual_Basic_.NET/Arithmetic_operators)

 18 мая 2012 г., 17:45
Что вы на самом деле пытаетесь сделать здесь? Для меня это звучит так, как будто вы ищете способpresent номер для пользователя. В этом случае я предлагаю посмотреть наnumber format strings, Они предоставляют вам способ представления числа, когда вы помещаете его в строку.
 AltF4_18 мая 2012 г., 17:19
что если бы у меня было 10 ??? или только 11 ???? мне нужно вернуть их, как они есть .... но если у меня было 10.0, то он снимает 0, так что повторяет только 10?
 18 мая 2012 г., 17:20
@ Аш: это не связано с двойной. Если у вас был дабл, равный 10,0, и вы как-то сняли .0, то вы получите точно такое же число. .0 будет исходить только от того, как вы форматируете его, когда вы конвертируете его в строку.

Вы имеете в виду что-то вроде:

if (x == Math.Floor(x))

? Обратите внимание, что обычно с двоичной арифметикой с плавающей запятой вы хотите иметь некоторый допуск, чтобы 10.000001 рассматривался как "довольно близко к 10". Например:

if (x - Math.Floor(x) < Tolerance)
{
    ...
}
 AltF4_18 мая 2012 г., 17:17
почему это возвращает целое число, если оно не получило .0 как просто число, которое ему нравится, если рассматриваемое число равно 10, оно возвращает 10D
 18 мая 2012 г., 17:17
Если у вас есть отрицательные числа, второй может делать смешные вещи (например,Math.Floor(-10.00000001) является-11 потому что это всегда округляется вниз ...
 18 мая 2012 г., 17:42
@AshShafiee: Да, потому что это принципиально не является частью числа. 1 и 1.0 и 1.00 все представлены одинаково вdouble, Если вы хотите различать их,you can't use double, Это может означать, что у вас, конечно, есть фундаментальная проблема дизайна ...
 18 мая 2012 г., 17:33
@AshShafiee: если они типаdouble тогда они четкоare обязательно цифры (или значения NaN, я думаю). Не похоже, что они могут быть чем-то еще.
 18 мая 2012 г., 17:18
@AshShafiee: Мне не понятно, что ты имеешь в виду. Там нет разницы между 10 и 10,0 вSystem.Double.

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

(double)(4.9 % (int)(4.9))

Ваш ответ на вопрос