如何在VB.NET中获取小数点后的数字

时间:2012-05-18 15:08:44

标签: .net vb.net math

有人能给我一个简单的方法来找出双倍小数点后的数字吗? 我需要做的就是找出数字是否以0结尾,如1.0或10.0或323.0?

你对此有什么想法吗?

8 个答案:

答案 0 :(得分:3)

你的意思是:

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

?请注意,通常使用二进制浮点运算,您希望具有某种容差,因此10.000001被视为“非常接近10”。例如:

if (x - Math.Floor(x) < Tolerance)
{
    ...
}

答案 1 :(得分:3)

只需使用Mod运算符,如下所示:

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

(见http://en.wikibooks.org/wiki/Visual_Basic_.NET/Arithmetic_operators

答案 2 :(得分:3)

你需要做的是乘以10然后再乘以10。

例如。比方说x = 10.2

temp = x * 10'temp等于102

temp = temp%10'应返回2. Temp现在是您需要的小数值。

这也适用于负值。

如果您需要进行比较以查看它是否为0,您所做的只是将您的temp var与0进行比较。

答案 3 :(得分:2)

如果您使用任何数字数据类型(例如,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

答案 4 :(得分:1)

尝试此功能:

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 ...

答案 5 :(得分:1)

如果您的输入是一个字符串,并且您想要识别具有小数的字符串,但这些小数位数都为零,那么您可以使用正则表达式:

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

答案 6 :(得分:0)

这是你可以尝试的东西。将double转换为int将删除小数位。然后你可以对相同的数字进行Mod操作,得到的余数等于小数位。

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

答案 7 :(得分:0)

已经有一段时间了,不过我的解决方案是:

我也使用了mod函数,但你必须要小心,因为有精确的&#34;问题&#34;使用数据类型&#39; Double&#39;:

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

因此我写了这个函数:(例如:number = 1.25)

  • 我首先使用参数编号 mod 使用自己的整数(1.25 mod 1)
  • 所以我得到了我的号码的十进制值并将其存储到remVal = 0.25
  • 在循环中我将 remVal 与10相乘并将此值与相同的截断值(即:2.5&lt; 2)进行比较,直到它们相同为止
  • 每次循环
  • 我将乘数增加10
  • 一旦两个值匹配(即:25 = 25),我可以使用 remVal 乘数

    返回我的小数值
    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