Я наблюдаю интригующую ситуацию вокруг валюты в 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 составляет два десятичных знака для текущей величины, поэтому не допускайте десяти тысячныхместо свернуть число вверх, потому что оно незначительно?
Как реализован этот метод?Мы находимся в сдвиге или что-то еще происходит?
Спасибо за любые идеи.