Я наблюдаю интригующую ситуацию с округлением валюты в C# (VS 2008 SP1). Ниже приведено изображение тестовых случаев:
замещающий текст http://img697.imageshack.us/img697/8500/testcases.png< /а>
Я ожидал, что случаи пять, шесть и семь (моя ошибка, что я не пронумеровал их в выводе) округлили число до копейки.
Вот мой тестовый код:
static void Main(string[] args)
{
decimal one = 10.994m;
decimal two = 10.995m;
decimal three = 1.009m;
decimal four = 0.0044m;
decimal five = 0.0045m;
decimal six = 0.0046m;
decimal seven = 0.0049m;
decimal eight = 0.0050m;
Console.WriteLine(one + ": " + one.ToString("C"));
Console.WriteLine(two + ": " + two.ToString("C"));
Console.WriteLine(three + ": " + three.ToString("C"));
Console.WriteLine(four + ": " + four.ToString("C"));
Console.WriteLine(five + ": " + five.ToString("C"));
Console.WriteLine(six + ": " + six.ToString("C"));
Console.WriteLine(seven + ": " + seven.ToString("C"));
Console.WriteLine(eight + ": " + eight.ToString("C"));
Console.ReadLine();
}
Когда я задумался о .ToString(строковый формат), чтобы увидеть, что происходит, я нашел
public string ToString(string format)
{
return Number.FormatDecimal(this, format, NumberFormatInfo.CurrentInfo);
}
который имеет призыв к
[MethodImpl(MethodImplOptions.InternalCall)]
public static extern string FormatDecimal(
decimal value,
string format,
NumberFormatInfo info);
Есть ли какая-то логика в этом вызове, который говорит, что степень детализации для моих текущих настроек культуры для NumberFormatInfo составляет два десятичных знака для валюты, поэтому не позволяйте десятитысячным местам сворачивать число, потому что оно незначительно?
Как реализуется этот метод? Мы в стране битовых сдвигов, или происходит что-то еще?
Спасибо за любые идеи.