Округление Int из десятичного числа C # - PullRequest
0 голосов
/ 17 марта 2012

Мне трудно понять процесс округления при преобразовании десятичного числа в длинное.

Например,

decimal pi = Convert.ToDecimal(Math.PI);
long d = 2534254324524352;
long dpi = Convert.ToInt64(pi * Convert.ToDecimal(d));
//I'd like to do the reverse to get the value of d as dd
long dd = Convert.ToInt64(Convert.ToDecimal(dpi) /pi);

В этом конкретном примере это работает, но иногда, когдаЯ пытаюсь вернуть номер, это не работает.Когда вы переводите десятичное число в длинное, существует ли точный способ округления?Есть ли способ контролировать это поведение?

Спасибо

1 Ответ

3 голосов
/ 17 марта 2012

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));
...