doubleの小数点以下の数字を簡単に見つける方法を誰か教えてもらえますか?
私がする必要があるのは、数字が 1.0 または 10.0 または 323.0 のように 0 で終わるかどうかを調べることだけです。
これについて何か考えはありますか?
Mod
次のように、演算子を使用するだけです。
If (x Mod 1) = 0 Then
' Do some stuff
End If
(http://en.wikibooks.org/wiki/Visual_Basic_.NET/Arithmetic_operatorsを参照してください)
次のような意味ですか。
if (x == Math.Floor(x))
? 通常、2 進浮動小数点演算では、10.000001 が「10 にかなり近い」ものとして扱われるように、何らかの許容範囲が必要であることに注意してください。例えば:
if (x - Math.Floor(x) < Tolerance)
{
...
}
あなたがする必要があるのは、10 を掛けてから 10 を法とすることです。
例えば。x = 10.2 としましょう
temp = x * 10 ' temp は 102 に等しい
temp = temp % 10 ' は 2 を返すはずです。Temp は、必要な 10 進数の値になりました。
これは、負の値でも機能するはずです。
0 かどうかを比較する必要がある場合は、一時変数を 0 と比較するだけです。
数値データ型 (double、single、integer、decimal など) を使用している場合、10.0 と 10 を 2 つの異なる異なる値として表すことはできません。それを行う方法はありません。数値の仮数を保持する必要がある場合は、仮数がゼロの場合でも、値を文字列などの他のデータ型として保存する必要があります。
入力された文字列を検証するには、次のようにします。
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
}
しばらく経ちましたが、私の解決策は次のとおりです。
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)
2 つの値が一致するとすぐに (つまり、25 = 25)、 remValと乗数を使用して 10 進値を返すことができます。
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
ここにあなたが試すことができるものがあります。double を int に変換すると、小数点以下が削除されます。次に、同じ数値に対して Mod 操作を実行すると、小数点以下の桁数に等しい剰余が得られます。
(double)(4.9 % (int)(4.9))