Вы также можете рассмотреть возможность использования decimal
.
size = (long)Math.Round(size * 1.28m);//note the m making the literal a decimal.
. В этой ситуации это дает два преимущества по сравнению с double
:
decimal
может представлять каждый long
значение точно (в отличие от double
, который имеет только 53 бита мантиссы, десятичное число имеет> 90 бит мантиссы, с достаточным для представления 63 битов, используемых long
) - он может точно представлять 1,28.*
Вы также должны убедиться, что MidpointRounding.ToEven
подходит для вас.Он округляет 1.5
до 2
, но 0.5
до 0
.
При использовании Decimal
приведение к long
, если значение выходит за пределы диапазона long
, вызовет исключение.
При использовании double
поведение переполнения зависит от режима.Если вы находитесь в разделе checked
, он выдаст исключение, в контексте unchecked
это приведет к неопределенному значению.Поскольку неопределенные значения редко желательны, я рекомендую использовать checked
с double
:
size = checked((long)Math.Round(size * 1.28));