2012-04-09 92 views
1

我正在寻找一种方式来四舍五入到最接近的美元以下规定:
(如果wholenumber.50以上四舍五入到下一个整数)
(如果wholenumber.49和下面轮下跌到目前的整数)整到最近的美元

我曾尝试:

Math.Round(wholenumber.xx, MidpointRounding.ToEven); 

这并不总是圆我多么希望,例如1.5 = 2和2.5 = 2,因为它四舍五入到最接近的偶数。

我也曾尝试:

Math.Round(wholenumber.xx, MidpointRounding.AwayFromZero); 

这总是舍入到较大的整数。

是否有任何内置的功能为我正在尝试做什么,或者我需要写我自己的自定义方法来检查号码和做楼或ceil取决于?

+5

使用浮点算术存储货币是不是一个好主意,但.. – Jack 2012-04-09 21:40:19

+0

你可以做数学没有第二个参数,我想呢?这就是你所描述的默认舍入。 – MarioDS 2012-04-09 21:41:22

+3

MidpointRounding.AwayRoundZero就是你所描述的。这并不意味着要汇总所有值,只有中点(0.5)。 – dtb 2012-04-09 21:41:45

回答

11

首先,我注意到您应该始终使用decimal来完成此任务;从不使用double。如果您使用的是double,请立即停止正在执行的操作并修复程序,以便您停止使用专为物理问题设计的类型问题,并开始使用专为设计的类型问题来解决您的资金问题。

其次,你当你说

这总是舍入到较大的整数是完全错误的。

它没有。它会四舍五入到最接近的整数,如果因为处于中点而没有最接近的整数,那么它将选择距离零较远的整数

试试吧,如果你不相信我:

using System; 
class P 
{ 
    static void Main() 
    { 
    decimal buckFifty = 1.50m; 
    decimal buckFortyNine = 1.49m; 
    Console.WriteLine(Math.Round(buckFortyNine, MidpointRounding.AwayFromZero)); 
    Console.WriteLine(Math.Round(buckFifty, MidpointRounding.AwayFromZero)); 
    Console.WriteLine(Math.Round(-buckFortyNine, MidpointRounding.AwayFromZero)); 
    Console.WriteLine(Math.Round(-buckFifty, MidpointRounding.AwayFromZero)); 
    } 
} 

结果

1 
2 
-1 
-2 
+0

我明白你的意思了。我在处于中点的时候正在考虑它。在中点时它总是走向更高的数字。我也正在使用Decimal。 – Baxter 2012-04-09 21:51:44

+1

@Baxter:*“在中点时,它总是走向更高的数字。”* - 根据你的问题,这正是你想要的...... – 2012-04-09 21:52:59

+0

谢谢,这使我变得直率。 – 2012-04-09 21:53:24