Валюта форматирования 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 составляет два десятичных знака для валюты, поэтому не позволяйте десятитысячным местам сворачивать число, потому что оно незначительно?

Как реализуется этот метод? Мы в стране битовых сдвигов, или происходит что-то еще?

Спасибо за любые идеи.


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