Подтвердить что ты не робот

0.0/0.0 в С# не будет бросать "Попытка деления на ноль"?

Я видел этот код расчета финансов на моем другом компьютере:

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

Хорошо, как только я это увидел, я сказал ему, что double представлен в base 2 и НЕ может представлять финансовый расчет. вместо этого используйте decimal.

большой.

Но в тот момент, когда я меняю его на двойной Ive столкнулся:

Attempted to divide by zero.

HUH?

По-видимому - используя double, при делении на 0.0 он выполняет НЕ исключение:

enter image description here

Но возвращает NAN.

В то время как мой код (используя decimal) делает исключение (когда Total есть zero)

И поэтому я спрашиваю:

Я проверил 0.0==0 и вернул true. так почему я не получаю исключение, кроме NAN? Я знаю, что это должно быть, но где распространено исключение исключения метаданных при делении double на ноль?

4b9b3361

Ответ 1

См. http://msdn.microsoft.com/en-us/library/system.double.nan.aspx

Метод или оператор возвращает NaN, когда результатом операции является undefined. Например, результат деления нуля на ноль равен 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.");

Ответ 2

В отличие от операций со встроенными типами, которые вызывают исключения в случаях переполнения или незаконных операций, таких как деление на ноль, операции с плавающей запятой не генерируют исключений. Вместо этого в В исключительных ситуациях результатом операции с плавающей запятой является нуль, положительная бесконечность, отрицательная бесконечность или не число (NaN):

От Double в MSDN.

Ответ 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 (какой десятичный код похож!)

Ответ 4

Это документально:

Метод или оператор возвращает NaN, когда результатом операции является undefined. Например, результат деления нуля на ноль равен NaN.

Ответ 5

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

Арифметическое переполнение с плавающей запятой или деление на ноль никогда не бросает исключение, поскольку типы с плавающей запятой основаны на IEEE 754 и поэтому имеют положения для представления бесконечности и NaN (не числа).

этот ответ дает хороший фон