2012-01-20 15 views
3

私は子供が10進値(I.E. 0.xxxx - precision 4)を端数に変換しなければならないプログラムを作成しています。小数点が終了するかどうかはどのように知ることができますか?

私は私が意味する、端数が終了するかどうかを知っておく必要があります。

1/9 ~ 0.111しかし111/1000 = 0.111

私はFractionクラスを作成していますが、私はどのようにこの2つの場合を区別することは考えています。

public class Fraction 
{ 
    #region Fields 

    private int _numerator; 
    private int _denominator; 

    #endregion 

    #region Properties 

    public int Numerator 
    { 
     get { return _numerator;} 
     set { _numerator = value;} 
    } 

    public int Denominator 
    { 
     get { return _denominator;} 
     set { _denominator = value;} 
    } 

    public decimal DecimalValue 
    { 
     get { return (decimal)_numerator/_denominator; } 
    } 

    #endregion 

    #region Constructors 

    public Fraction() { } 
    public Fraction(int numerator, int denominator) 
    { 
     this.Numerator = numerator; 
     this.Denominator = denominator; 
    } 

    #endregion 
} 

私を助けてくれますか? ありがとうございます。

+0

それは無限だ場合、分母は精度に応じて、0または非常に近い0です。 0をチェックしますか? – MyStream

+0

申し訳ありません、分数が0.1回繰り返されているかどうかを調べようとしていますか? 0.111111のように...?または、結果の端数が実際に無限大の表現であるべきかどうかを調べようとしていますか?私はちょっと混乱しています。 – blahman

+0

@blahman第2の1つ –

答えて

11

分母の素因数分解を求めます。

すべての素因数が2または5の場合、それは10進表現が有限である。

2または5以外の素因数を持つ場合、それは繰り返し小数です。ステファン・Hが指摘するように、そしてnumerator % denominatorが0でないことを確認してください -

編集

は(10の素因数は2と5をし​​ているので、それは動作します)。

+3

これは不完全なようです... 14/7には小数点が繰り返しありません。 0 –

+0

に等しい分子モジュロ分母のチェックが不足しています - なぜあなたの答えが不完全なのか?それが私が指摘していたすべてです。 –

+1

ありがとうございました!ここにコードがあります。if(Numerator%Denominator == 0) falseを返します。 var primes =分母。プライム(); (n!= 2 && n!= 5) return true; } falseを返します。 –

3

何の余りがない場合は、....

を私は次のことを証明するか反証するために、この上の徹底的な分析を行っていませんでしたが、私の頭の上から、以下が全体の数字のために働くようですあなたは心配することはありません。 剰余があり、分母に2と5以外の因子がある場合、分数が繰り返されます。

分母が小数である場合、これらの規則を微調整する必要があります。

これが役に立ちます。

+0

彼のコードは、分子と分母が小数部のない整数であることを示しています。ただそれに気づく。 – doogle

関連する問題