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 на ноль?
Ответы
Ответ 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 (не числа).
этот ответ дает хороший фон