Convert.ToInt64
, как и большинство методов конвертации по умолчанию, использует округление банкира , то есть округление до ближайшего кратного двух. Вот демоверсия - 6,5 и 5,5 округлены до 6.
Console.WriteLine("Rounding 5.5 to {0}", Convert.ToInt64(5.5D)); // 6
Console.WriteLine("Rounding 6.5 to {0}", Convert.ToInt64(6.5D)); // 6
Вы можете изменить это поведение, используя Math.Floor
или Math.Ceil
на decimal
перед преобразованием его в long
, , как показано здесь . Math.Floor
это, вероятно, то, что вам нужно.
Console.WriteLine("Rounding 5.5 to {0}", Convert.ToInt64(Math.Floor(5.5D))); // 5
Console.WriteLine("Rounding 6.5 to {0}", Convert.ToInt64(Math.Floor(6.5D))); // 6
Итак:
decimal pi = Convert.ToDecimal(Math.PI);
long d = 2534254324524352;
long dpi = Convert.ToInt64(Math.Floor(pi * Convert.ToDecimal(d)));
long dd = Convert.ToInt64(Math.Floor(Convert.ToDecimal(dpi) / pi));