0

doubleの小数点以下の数字を簡単に見つける方法を誰か教えてもらえますか?
私がする必要があるのは、数字が 1.0 または 10.0 または 323.0 のように 0 で終わるかどうかを調べることだけです。

これについて何か考えはありますか?

4

8 に答える 8

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

次のような意味ですか。

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

? 通常、2 進浮動小数点演算では、10.000001 が「10 にかなり近い」ものとして扱われるように、何らかの許容範囲が必要であることに注意してください。例えば:

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

あなたがする必要があるのは、10 を掛けてから 10 を法とすることです。

例えば。x = 10.2 としましょう

temp = x * 10 ' temp は 102 に等しい

temp = temp % 10 ' は 2 を返すはずです。Temp は、必要な 10 進数の値になりました。

これは、負の値でも機能するはずです。

0 かどうかを比較する必要がある場合は、一時変数を 0 と比較するだけです。

于 2012-05-18T15:33:13.217 に答える
2

数値データ型 (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
于 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

しばらく経ちましたが、私の解決策は次のとおりです。

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) で変更します
  • だから私は自分の数値の10進数値を取得し、それを remVal = 0.25 に保存します
  • ループ内で、remValに 10 を掛け続け、この値と同じ切り捨てられた値(つまり、2.5 <> 2) を同じになるまで比較します。
  • ループごとに乗数を10ずつ増やします
  • 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
    
于 2015-02-11T15:45:55.743 に答える
0

ここにあなたが試すことができるものがあります。double を int に変換すると、小数点以下が削除されます。次に、同じ数値に対して Mod 操作を実行すると、小数点以下の桁数に等しい剰余が得られます。

(double)(4.9 % (int)(4.9))
于 2014-06-18T15:05:04.050 に答える