Валута на форматиране на C#

Виждам интригуваща ситуация със закръгляване на валутата в 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, или се случва нещо друго?

Благодаря за всякакви прозрения.


person blu    schedule 06.04.2010    source източник
comment
Ако наистина искате случаи 5, 6, 7 да се закръглят до стотинка, тогава трябва първо да закръглите до половин пени: Math.Round(five, 3, MidpointRounding.AwayFromZero): Резултатът от това ще се закръгли до пени .   -  person Igby Largeman    schedule 07.04.2010
comment
Намерете култура, която измерва милидолари и ще бъдете оправдани.   -  person Hans Passant    schedule 07.04.2010
comment
А, не, не разбираш. Много е сложно. Това е съвкупност, така че тук говоря за части от пенито. И с времето те се добавят много. imdb.com/title/tt0151804/quotes?qt0996772   -  person blu    schedule 07.04.2010
comment
@Charles се съгласи и ако го искат, ще го получат. Въпреки че не мисля, че ще мога да се справя, това е елементарна математика! с тях.   -  person blu    schedule 07.04.2010


Отговори (1)


Следвайки основните математически принципи, случаи 4, 5, 6 и 7 не трябва да се закръглят до стотинка. Не закръглявате, като започвате от най-дясното число и закръглявате нагоре. Гледате само една цифра вдясно от числото, до което искате да закръглите.

http://www.enchantedlearning.com/math/rounding/

компютърът просто изпълнява основна математика, както се предполага.

Редактиране – добавено

по-добра връзка: http://math.about.com/od/arithmetic/a/Rounding.htm

person David    schedule 06.04.2010
comment
Интересно, какво ще кажете за случай 1 тогава? - person blu; 07.04.2010
comment
В случай 1, последната цифра би принудила последните 9 да се закръглят нагоре. Тъй като 9 + 1 = 10, тогава към следващите 9 трябва да се добави 1 и тъй като това е 9... - person David; 07.04.2010
comment
Добре, така че казваме, че закръгляме до стотните, така че гледайте само числото директно вдясно. Добре, добър отговор, благодаря. - person blu; 07.04.2010