C#格式化货币

3

我看到一个有趣的情况,涉及C#(VS 2008 SP1)中的货币舍入。下面是测试用例的图像:

alt text 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(string format) 时,发现了以下情况:

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的粒度为货币的两位小数,因此不要让万分位使数字上升,因为它是无关紧要的?

这个方法是如何实现的?我们进入了位移领域,还是发生了其他事情?

感谢任何见解。


如果你真的想让第5、6、7种情况四舍五入到一分钱,那么你需要先将其四舍五入到半分钱:Math.Round(five, 3, MidpointRounding.AwayFromZero):这样的结果会四舍五入到一分钱。 - Igby Largeman
找到一个度量千分之一美元的文化,你就会得到证明。 - Hans Passant
1
啊,你不理解。这很复杂。它是聚合的,所以我在谈论一分钱的零头。随着时间的推移,它们会累积成很多。 - blu
@Charles同意,如果他们想要它,他们会得到它。虽然我不认为我能够向他们解释"这是基本数学!"。 - blu
1个回答

8

有趣,那么第一种情况怎么样? - blu
在情况1中,最后一位数字会强制将最后一个9四舍五入。由于9 + 1 = 10,那么下一个9必须加1,而由于它是9... - David
好的,我们要四舍五入到百分位,所以只看右边直接的数字。好的,回答得很好,谢谢。 - blu

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接