2012-02-22 7 views
0

大きな整数の整数表現を何かで分けて作成しようとしています。次のコードはそれを行うコードです、基本的に私は2つの場所の精度が欲しいです。小数点を含むBigInteger文字列表現

public string GetDecimal(BigInteger bigInteger,int divisor) 
    { 
     var remainder = BigInteger.Remainder(bigInteger, divisor); 
     var dividend = BigInteger.Divide(bigInteger, divisor); 

     var d = ((double)remainder/divisor); 
     var decimalPart = Math.Round(d, 2); 
     var retValue = dividend + decimalPart.ToString(".00"); 
     return retValue; 
    } 
} 

これを行うには良い方法がありますか?

おかげで、 -Mike

+1

1つのDivRemコールで最初の2行を実行できます - http://msdn.microsoft.com/en-us/library/system.numerics.biginteger.divrem.aspx –

+0

変数 'dividend'に名前を付ける必要があります'商 '。 「配当」とは「分割されたもの」を意味する。配当は分数の分子に似ています。つまり、商=配当/除数。 – phoog

+0

あなたのコードは実際に壊れています。 '999' /' 1000'でテストしてください – CodesInChaos

答えて

2

おそらくタイプを変換せず、あなた自身で長い分割を行うべきです。これはBigIntegerの値で動作します。私はここに改善の余地があると確信している

...代わりに、特に、二重のような精度の低いタイプを使用して、その上に数学をやっての

public string GetDecimal(BigInteger bigInteger, int divisor) 
{ 
    BigInteger remainder; 
    var quotient = BigInteger.DivRem(bigInteger, divisor, out remainder); 

    const int decimalPlaces = 2; 
    var decimalPart = BigInteger.Zero; 
    for(int i = 0; i < decimalPlaces; i++) 
    { 
     var div = (remainder*10)/divisor; 

     decimalPart *= 10; 
     decimalPart += div; 

     remainder = remainder*10 - div*divisor; 
    } 

    var retValue = quotient.ToString() + "." + decimalPart.ToString(new string('0', decimalPlaces)); 
    return retValue; 
} 
+0

これは '999/1000'のケースで動作します。 –

+0

この出力は2の精度で出力されますか?私は、7.0のようなゼロの精度を得るに過ぎず、7.00ではなく。 – Mike

+0

@Mike:私は末尾のゼロをテストしませんでした。私がチェックします。 - すべてのゼロを扱うために編集されました –

0

は、.NETで構築decimalタイプは128ビットであり、他のタイプの同様の丸め構築物で動作します。この数字は十分に大きくないのですか?

+0

いいえ、そうではありません。 BigIntegerに行く。 – Mike

+0

さて、これを金銭計算に使用していると仮定します(小数点以下第2位を四捨五入しています)、精度問題を防ぐために 'double'の代わりに' decimal'を使用することをお勧めします。 – Matthew

+0

@Matthewもし彼がとにかく小数点以下第二位に四捨五入しているならば、彼はあなたが小数点第10位を過ぎるまで現れない、「倍精度」の精度問題の影響を受けないでしょう。 – phoog

0

。 単純に最後の2桁以外のすべてを含む文字列を作成し、小数点を追加して最後の数字を入れます。

int precision = 2; 
negative = 0; 
if (bigInteger < 0) 
{ 
    negative = 1; 
} 
String strValue = bigInteger.ToString().PadRight(precision + negative + 1,'0'); 
return strValue.Insert(strValue.Length - precision, "."); 
0
var s=((bigInteger*200+divisor)/(2*(BigInteger)divisor)).ToString(); 
return s.Insert(".",s.Length-2); 

このコードのようなものは、正の値だけのために働く、とAwayFromZero中間丸めを使用しています。私はローカリゼーションの問題についても気にしなかった。

関連する問題