C # Форматирование валюты - PullRequest
       22

C # Форматирование валюты

3 голосов
/ 07 апреля 2010

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

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

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

1 Ответ

8 голосов
/ 07 апреля 2010

Следуя базовым математическим принципам, случаи 4, 5, 6 и 7 не должны округляться до копейки.Вы не округляетесь, начиная с самого правого числа и округляя вверх.Вы смотрите только одну цифру справа от числа, которое хотите округлить.

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

компьютер просто выполняет базовую математику, как и положено.

Редактировать - добавлено

Лучшая ссылка: http://math.about.com/od/arithmetic/a/Rounding.htm

...