Я заметил что-то очень странное при работе с добавлением обнуляемых поплавков. Возьмите следующий код:
float? a = 2.1f;
float? b = 3.8f;
float? c = 0.2f;
float? result =
(a == null ? 0 : a)
+ (b == null ? 0 : b)
+ (c == null ? 0 : c);
float? result2 =
(a == null ? 0 : a.Value)
+ (b == null ? 0 : b.Value)
+ (c == null ? 0 : c.Value);
result
6.099999
, тогда как result2
- 6.1
. Мне повезло, что я наткнулся на это, потому что, если я изменил значения для a
, b
и c
, поведение, как правило, выглядит правильным. Это также может случиться с другими арифметическими операторами или другими типами значений NULL, но это случай, когда я смог воспроизвести. Я не понимаю, почему в первом случае неявное преобразование в float
из float?
работало некорректно. Я мог бы понять, попытался ли получить значение int
, учитывая, что другая сторона условного выражения 0
, но это не похоже на то, что происходит. Учитывая, что result
отображается некорректно для некоторых комбинаций значений с плавающей запятой, я предполагаю, что это какая-то проблема округления с несколькими преобразованиями (возможно, из-за бокса/распаковки или чего-то еще).
Любые идеи?