2009-05-25 9 views
10

はこの考えてみましょう:なぜモジュラス演算子はC#で倍精度で動作しないのですか?

double x,y; 
x =120.0; 
y = 0.05; 

double z= x % y; 

を私はこれを試してみましたが、結果は0であることを期待しますが、0.04933333を出てきました。しかし

は、

x =120.0; 
y = 0.5; 
double z= x % y; 

は確かにここで何が起こっている0

の正しい結果を与えたのですか?

Math.IEEERemainder(double, double)を試しましたが、0にも戻っていません。ここで何が起こっているのですか?

また、脇に、C#で余りを見つける最も適切な方法は何ですか?

+0

あなたが達成しようとしていることを知ることは興味深いでしょう。浮動小数点数でモジュラスを使うことは、答えがすでに述べられているので、決して良い考えではありません。 – VVS

答えて

14

doubleは、格納形式のため、すべての値を正確に入力または表示することはできません。人間の数字の表現は通常10進形式であり、doubleはデュアルシステムに基づいています。

doubleには、120が整数値であるため正確に格納されます。しかし、0.05はありません。 doubleは、最も近い数値に近似され、0.05を表すことができます。 0.521/2)の累乗であるため、正確に格納することができ、丸めエラーは発生しません。

すべての数字を10進法で入力/表示するのとまったく同じ方法を使用するには、代わりにdecimalを使用します。

+0

'double'は常に正確な値です。その値を決定した操作は不正確かもしれません。 'double a = 0.1;' - > 'a'は、数学的な0.1よりわずかに異なる正確な値を持ちます。 'double b = 0.125;' - > 'b'は、数学的な0.125と同じ正確な値を持ちます。 'decimal'を使うのは良い考えです。 – chux

+2

"正確な値はわずかに異なるかもしれません" ==不正確です。 –

+0

整数の場合、7を3で割った商は2であり、2.333の数学的商とは異なりますが、整数は正確であるとみなされます。 FPと同様に、7.0を3.0で割った結果は、数学的には2.333の値に近いが、同じではない結果になる。どちらの場合も、演算は数学とまったく同じではない。どちらの場合も結果は正確です。 – chux

9
あなたのような何かを行うことができ

:これは役立つはず

double a, b, r; 

a = 120; 
b = .05; 

r = a - Math.floor(a/b) * b; 

;)

0

モジュラスをすべき整数でのみ使用できます。残りはユークリッド部門から来ます。二重で、予期せぬ結果を得ることができます。

は、私はあなたがdecimalと同じことをしようとした場合、それが適切に働くだろうと考えてい

+2

小数点付きの法を安全に使用できます。 –

関連する問題