14

私は友人のコンピュータで次の財務計算コードを見ました:

double Total = ...
double Paid = ...
double Wating_For_Details = ...
double Decuctibles = ...
double Rejected = ...

doubleええと、これを見た瞬間、は で表され、金融計算を表すことはbase 2できないと彼に言いました。代わりに使用decimalします。

すごい。

しかし、私が遭遇した二重に変更した瞬間:

Attempted to divide by zero.

は ?

どうやら - を使用して、それでdouble除算しても例外がスロー0.0されない:

ここに画像の説明を入力

しかし、戻りますNAN

私のコード(を使用decimal)が例外をスローしている間(Totalときzero

そして、私は尋ねます:

チェック0.0==0したところ、trueが返されました。なぜ私は例外を受けていないのNANですか?それがどうあるべきかはわかっていますが、 double をゼロで除算するときに例外をスローしないという一般的な意味はどこにありますか?

4

5 に答える 5

17

オーバーフローまたはゼロ除算などの不正な演算の場合に例外をスローする整数型の演算とは異なり、浮動小数点値の演算は例外をスローしません。代わりに、例外的な状況では、浮動小数点演算の結果はゼロ、正の無限大、負の無限大、または非数 (NaN) になります。

DoubleMSDNから

于 2013-07-04T14:43:50.520 に答える
8

http://msdn.microsoft.com/en-us/library/system.double.nan.aspxを参照してください。

演算の結果が未定義の場合、メソッドまたは演算子は NaN を返します。たとえば、次の例に示すように、0 を 0 で除算した結果は NaN になります。(...) さらに、次の例に示すように、NaN 値を使用したメソッド呼び出しまたは NaN 値に対する操作は NaN を返します。

次のコード例は、NaN の使用を示しています。

  Double zero = 0;

  // This condition will return false. 
  if ((0 / zero) == Double.NaN) 
     Console.WriteLine("0 / 0 can be tested with Double.NaN.");
  else 
     Console.WriteLine("0 / 0 cannot be tested with Double.NaN; use Double.IsNaN() instead.");
于 2013-07-04T14:45:18.500 に答える
3

ゼロ (0.0) で除算する場合、double にはいくつかの特別な動作があります。

d/0.0 => Double.NaN if d==0.0
d/0.0 => Double.PositiveInfinity if d>0.0
d/0.0 => Double.NegativeInfinity if d<0.0

DivideByZeroException は Integer に対してのみスローされます (これは Decimal のようなものです!)

于 2013-07-04T14:46:44.197 に答える
1

それは文書化されています:

演算の結果が未定義の場合、メソッドまたは演算子は NaN を返します。たとえば、ゼロをゼロで除算した結果は NaN になります。

于 2013-07-04T14:44:00.613 に答える
1

http://msdn.microsoft.com/en-us/library/6a71f45d%28VS.80%29.aspx

浮動小数点型は IEEE 754 に基づいており、無限大と NaN (非数) を表現するための規定があるため、浮動小数点算術オーバーフローまたはゼロ除算が例外をスローすることはありません。

この回答は、いくつかの良い背景を提供します

于 2013-07-04T14:44:44.890 に答える