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

在VB.NET中,如何获取小数点后的数字,.net,vb.net,math,.net,Vb.net,Math,有人能给我一个简单的方法来找出双精度小数点后的数字吗? 我所需要做的就是找出数字是否以0结尾,比如1.0、10.0或323.0 你知道吗?你是说: if (x == Math.Floor(x)) ??请注意,通常使用二进制浮点运算时,您希望有某种公差,因此10.000001被视为非常接近10。例如: if (x - Math.Floor(x) < Tolerance) { ... } 只需使用Mod运算符,如下所示: If (x Mod 1) = 0 Then ' Do

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


你知道吗?

你是说:

if (x == Math.Floor(x))
??请注意,通常使用二进制浮点运算时,您希望有某种公差,因此10.000001被视为非常接近10。例如:

if (x - Math.Floor(x) < Tolerance)
{
    ...
}
只需使用Mod运算符,如下所示:

If (x Mod 1) = 0 Then
    ' Do some stuff
End If
请参见尝试此功能:

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

你需要做的是乘以10,然后mod 10

比如说。假设x=10.2

温度=x*10'温度等于102

temp=temp%10'应返回2。Temp现在是所需的十进制值

这也适用于负值


如果您需要进行比较以确定它是否为0,那么您所要做的就是将temp var与0进行比较

如果使用任何数字数据类型,例如双精度、单精度、整数、十进制,则不能将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

如果您的输入是一个字符串,并且您希望标识具有小数的字符串,但这些小数位数均为零,则可以使用正则表达式:

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

这里有一些你可以试试的。将double转换为int将删除小数点。然后你可以对同一个数字进行Mod运算,得到小数点后的余数

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

虽然已经有一段时间了,但我的解决方案是:

我还使用了mod函数,但您必须小心,因为数据类型“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
因此我编写了这个函数:示例:number=1.25

我首先取参数号,用它自己的整数1.25 mod 1对它进行修改 因此,我得到我的数字的十进制值,并将其存储到remVal=0.25 在循环中,我将remVal乘以10,并将该值与相同的截断值(即:2.52)进行比较,直到它们相同为止 每循环一次,我就把乘法器增加10 一旦两个值匹配,即:25=25,我就可以使用remVal和乘法器返回我的十进制值


例如,这个数字可能是10.04,在这种情况下,我不感兴趣。。。。点后0,你是说你想知道double是不是一个整数?这是正确的,然后想把这个数字作为字符串返回。因为它是进入的权利。如果您正在查看数据输入,那么您很可能有一个字符串。只需保存该字符串并使用下面提到的检查,如果它是一个完整的NUMBER,则返回该字符串。我不知道你为什么要这么做。通常,您希望显示所有数字的标准小数位数,例如tostring2,或者希望以最简单的形式返回数字,我认为ToString通常会这样做。你可能想编辑上面的问题,以便更清楚地了解你的开始和结束。如果你有负数,那么第二个可以做一些有趣的事情,例如Math.Floor-10.00000001是-11,因为它总是四舍五入…如果它没有得到一个整数,那么它会返回一个整数吗问题中的数字是它返回的1010D@AshShafiee当前位置我不明白你的意思。在System.Double中,10和10.0没有区别。@AshShafiee:如果它们是Double类型,那么它们显然是数字或NaN值,我猜。阿什沙菲:是的,因为这根本不是数字的一部分。1、1.0和1.00都以相同的方式表示为双精度。如果要区分它们,不能使用double。这可能意味着你有一个基本的设计问题,当然…如果我有10个呢???还是只有11????我需要按原样归还它们。。。。但是如果我有10.0,那么它会去掉0,所以它只返回10?@Ash:这与双精度无关。如果你有一个双倍的10.0,然后你以某种方式去掉了0,那么你会得到完全相同的数字。.0仅来自于将其转换为字符串时的格式化方式。您在这里实际要做什么?在我听来,你似乎在寻找一种向用户显示号码的方法。那样的话,我建议你看看。当你把数字放在字符串中时,它们为你提供了一种表示数字的方法。即使我没有小数点,仍然返回true。。。这不是很好,我需要得到不同的结果,如果我的数字是10或10.0。。。你有办法吗???我猜这个数字来自文件或文本框,是de
取决于用户如何输入?您可以将十进制转换为字符串,然后搜索“.”,然后设置布尔值,以便如果有十进制,请使用我的示例,如果没有,请使用您需要的任何返回值作为整数值。确定。。。除了字符串之外还有其他建议吗。。。因为这就是破坏数字的原因。。。。十进制如何?@AshShafiee:任何数字格式的双精度、单精度、十进制等都将对数字10.0和10进行相同的处理。唯一不会出现的格式是字符串或类似的等效格式。显而易见的原因是,只有在一个字符串中,两者之间才有区别。你能解释为什么你认为字符串破坏了数字,或者你的意思是什么吗?@AshShafiee字符串数据类型以什么方式破坏了数字?正如Chris所说,任何数字格式都会有同样的问题。如果你需要一个精确的数字,decimal是一个不错的选择,而不是浮点数数据类型,但这听起来不是你现在关心的问题。这确实是你最好的选择。如果为了转换需要将值存储到临时变量中,这样就不会丢失双精度值。使用任何类型的数字数据类型时,虽然10和10.0之间不可能有差异,因为它们是相同的数字。对于字符串数据类型,它们是完全不同的值。
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