2013-05-14 9 views
14

私はもともとこれを試しましたが、%演算子はfloat64のために定義されていません。浮動小数点数がGoの整数であるかどうかをテストするにはどうすればよいですか?

if a == float64(int64(a)) { 
    fmt.Println("yay") 
} else { 
    fmt.Println("you fail") 
} 

は、そうでなければ、あなたがmath.Truncを使用することができます。

func main(){ 
    var a float64 
    a = 1.23 
    if a%1 == 0{ 
     fmt.Println("yay") 
    }else{ 
     fmt.Println("you fail") 
    } 
} 

答えて

12

int64に収まるあなたの数字を仮定すると、あなたはちょうど彼らが同じことをしているかどうかを確認するために変換された整数値をfloat値を比較することができます1は全体float64ドメイン内で動作するはず

if a == math.Trunc(a) { 
    fmt.Println("yay") 
} else { 
    fmt.Println("you fail") 
} 

:機能のようなもので、hereを詳しく説明しました。

+0

よくタイプされたGo式のようには見えません。 Goは、 '=='の両方のオペランドがまったく同じ型であると主張しています。 – Gian

+1

実際、これを試してみると、それは前述の理由からよくタイプされていないものとして拒否されます。 1つは最初に浮動小数点にキャストする必要があります。 – Gian

+0

はい、あなたは正しいです、私はちょっと忘れて、修正するために編集しました。 – paxdiablo

1

math.Trunc?それはfloat64をその全数構成要素に切り捨てます。例えば

、のようなもの:

if a.Trunc() == a { 
    // ... 
} 

は、浮動小数点表現の制限に関する通常の考慮事項に注意してください。 1.00000000000000002のような値を考慮に入れて、a.Trunc()aの小さな範囲内にあるかどうかを確認したい場合があります。あなたはmath.Modf機能を使用することができます

+1

近くに見えますが、math.Trunc(a) 'a.Trunc()'ではありません。完全に修正された 'if'は、if aa:= math.Trunc(a)-aのようなものです。 aa <1e-5 && aa> -1e-5 {...} ' – twotwotwo

+0

不完全な答えです。 – dolmen

-1

私は、次のコードは、役に立つかもしれないと思う

func main(){ 
    var (
      a float64 
      b float64 
      c float64 
    ) 
    a = 1.23 
    b = float64(int64(a)) 
    c = a - b 
    if c > 0 { 
     fmt.Println("Not a Whole Number") 
    } else { 
     fmt.Println("Whole Number") 
    } 
} 
+0

ここで「b」があふれてしまう危険性があるようですか? – Gian

+1

問題は、 'a'は' int'に強制されている 'float64'であり、その時点で(32ビット)' int'型をオーバーフローさせてしまい、 、偽陰性)。 – Gian

+0

私は今それがO.Kだと信じています。 – Deepu

2

const epsilon = 1e-9 // Margin of error 
if _, frac := math.Modf(math.Abs(a)); frac < epsilon || frac > 1.0 - epsilon { 
    // ... 
} 

epsilonを(例えばfloat64(.3)+float64(.6)+float64(.1) != 1)浮動小数点演算が正確ではないので、ここでは必要である

godocから:

func Modf(f float64) (int float64, frac float64) 

Modfは、fと合計する整数および小数点浮動小数点数を返します。両方の値はfと同じ符号を持ちます。

+1

[浮動小数点の結果は通常正確ではありません](https://en.wikipedia.org/wiki/Floating_point#Accuracy_problems)私は 'Modf'を使用しますが、数値が_close_であるかどうかをチェックします。 (http://play.golang.org/p/uUZCt0brgl)。さもなければ 'float64(.3)+ float64(.6)+ float64(.1)'は非整数として扱われます。 – twotwotwo

+0

(Goが[型指定されていない定数をより正確に計算するために余計な手間がかかります](https://blog.golang.org/constants)ので、このサンプルの「不良」浮動小数点値の型が必要です。 ) – twotwotwo

+1

良い点、これを含むように修正されました。ありがとう! –

関連する問題