Виждам интригуваща ситуация със закръгляване на валутата в 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 е два знака след десетичната запетая за currenc, така че не позволявайте на десетхилядното място да преобръща числото, защото е незначително?
Как се прилага този метод? Дали сме в bit shift land, или се случва нещо друго?
Благодаря за всякакви прозрения.