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

Минус нуль (-0) эквивалентен нулю (0) в С#

Минус нуль (-0) эквивалентен нулю (0) в С#?

4b9b3361

Ответ 1

Для целых чисел нет двоичного представления, которое делает разницу между 0 и -0, поэтому они по определению равны.

Для чисел с плавающей запятой IEEE существует различие отрицательного и положительного нуля. Я провел несколько тестов (CLR.NET Framework 2.0, С# 3), и кажется, что они считаются равными, что на самом деле является ожидаемым по стандарту IEEE 754.

Вот мой тестовый код, чтобы показать, что:

    double minusOne = -1.0;
    double positiveZero = 0.0;
    double negativeZero = minusOne*positiveZero;
    Console.WriteLine("{0} == {1} -> {2}", positiveZero, negativeZero, positiveZero == negativeZero);
    Console.WriteLine("Binary representation is equal: {0}", BitConverter.DoubleToInt64Bits(positiveZero) == BitConverter.DoubleToInt64Bits(negativeZero));

Возврат:

0 == 0 -> True
Binary representation is equal: False

Ответ 2

Для десятичных чисел существует не менее 4 типов нулей:

Decimal zero = Decimal.Zero;
Decimal negativeZero1 = new Decimal(0, 0, 0, true, 0);
Decimal negativeZero2 = -0.0m;
Decimal negativeZero3 = Decimal.Negate(Decimal.Zero);

Пока все равны и распечатываются как "0", они имеют различное представление битов:

zero:          {0x00000000 00000000 00000000 00000000 }
negativeZero1: {0x00000000 00000000 00000000 80000000 }
negativeZero2: {0x00000000 00000000 00000000 80010000 }
negativeZero3: {0x00000000 00000000 00000000 80000000 }

Источник: Десятичное отрицательное нулевое представление

Ответ 3

if (-0 == 0) Console.WriteLine("YES, it is!");