谁能给我一个简单的方法来找出双精度小数点后的数字?
我需要做的就是找出数字是否以 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
(参见http://en.wikibooks.org/wiki/Visual_Basic_.NET/Arithmetic_operators)
您需要做的是乘以 10,然后再乘以 10。
例如。假设 x = 10.2
temp = 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
试试这个功能:
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 ...
如果您的输入是一个字符串,并且您想要识别具有小数的字符串,但这些小数位全为零,那么您可以使用正则表达式:
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)
只要两个值匹配(即:25 = 25),我就可以使用remVal和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