有人知道我如何获取一个格式化字符串来使用银行家舍入吗?我一直在使用"{0:c}",但它没有像银行家舍入那样进行四舍五入。Math.Round()
方法可以进行银行家舍入。我只需要能够使用格式化字符串来复制它的舍入方式。
注意:原问题有些误导性,提到正则表达式的回答也源于此。
有人知道我如何获取一个格式化字符串来使用银行家舍入吗?我一直在使用"{0:c}",但它没有像银行家舍入那样进行四舍五入。Math.Round()
方法可以进行银行家舍入。我只需要能够使用格式化字符串来复制它的舍入方式。
您是否可以直接在字符串输入上调用Math.Round()以获得所需的行为?
与其:
string s = string.Format("{0:c}", 12345.6789);
请做:
string s = string.Format("{0:c}", Math.Round(12345.6789));
正则表达式是一种模式匹配语言,不能在正则表达式中进行算术运算。
通过使用IFormatProvider和ICustomFormatter进行实验,以下链接可能会指导你正确的方向。http://codebetter.com/blogs/david.hayden/archive/2006/03/12/140732.aspx
.Net内置支持算术和银行家舍入:
//midpoint always goes 'up': 2.5 -> 3
Math.Round( input, MidpointRounding.AwayFromZero );
//midpoint always goes to nearest even: 2.5 -> 2, 5.5 -> 6
//aka bankers' rounding
Math.Round( input, MidpointRounding.ToEven );
即使"四舍五入其实是默认的,尽管在学校你学到的是"远离零"。
这是因为在计算机处理器底层也使用银行家舍入法。
"//defaults to banker's
Math.Round( input );
我本以为任何四舍五入格式字符串都会默认使用银行家舍入法,这不是这种情况吗?
public static class DoubleExtensions
{
public static string Format(this double d)
{
return String.Format("{0:c}", Math.Round(d));
}
}
然后,当你调用它时,你可以这样做:
12345.6789.Format();
0.5
上四舍五入的人的方法。0.5
恰好处于0和1之间,它不靠近任何一个数。决定你总是要向上舍入会引入偏差(例如你支付的税款不应总是向上舍入-这就不公平了)。银行家舍入法设置为一半时间向上舍入,一半时间向下舍入,这样可以平衡一切。该算法始终朝偶数数字舍入。例如:0.5 -> 0
,1.5 -> 2
,2.5 -> 2
,3.5 -> 4
,4.5 -> 4
。 - Ian Boyd