0

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

你对此有什么想法吗?

4

8 回答 8

3

你的意思是这样的:

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

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

if (x - Math.Floor(x) < Tolerance)
{
    ...
}
于 2012-05-18T15:11:45.887 回答
3

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

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

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

于 2012-05-18T15:12:50.280 回答
3

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

例如。假设 x = 10.2

temp = x * 10 ' 温度等于 102

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

这也适用于负值。

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

于 2012-05-18T15:33:13.217 回答
2

如果您使用任何数字数据类型(例如双精度、单精度、整数、小数),则不能将 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
于 2012-05-18T15:40:32.763 回答
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 ...
于 2012-05-18T15:14:59.217 回答
1

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

var regex = new Regex("^-?\\d+\\.0+$");
if (new Regex.IsMatch(input))
{
    // it's in the format you want
}
于 2012-05-18T16:08:16.257 回答
0

这是您可以尝试的方法。将 double 转换为 int 会删除小数位。然后您可以对相同的数字进行 Mod 运算,得到与小数位相同的余数。

(double)(4.9 % (int)(4.9))
于 2014-06-18T15:05:04.050 回答
0

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

我也使用了 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.5 <> 2)进行比较,直到它们相同
  • 对于每个循环,我将乘数增加 10
  • 只要两个值匹配(即:25 = 25),我就可以使用remValmultiplier返回我的十进制值

    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
    
于 2015-02-11T15:45:55.743 回答