在C#中使除法返回double的最佳做法是什么?

在c#中,如果要分割下面方法的结果,强制它返回double值而不是默认整数的最佳方法是什么。

(int)Math.Ceiling((double)(System.DateTime.DaysInMonth(2009, 1) / 7)); 

如你所见,我需要除法返回一个双,所以我可以使用天花板function。

两个int数的除法返回一个int ,截断任何小数点。 对于其他数据类型通常也是如此:算术运算不会改变其操作数的类型。

要强制执行某种返回类型,必须适当地转换操作数。 在您的特定情况下,将其中一个运算符转换为double实际上就足够了:这样,C#将自动执行另一个操作数的转换。

您可以选择:您可以显式转换任一操作数。 但是,由于第二个操作数是文字 ,因此最好直接使该文字成为正确的类型。

这可以使用类型后缀(在double的情况下为d )或在其后面写入小数点来完成。 后一种方式通常是优选的。 在你的情况下:

 (int)Math.Ceiling(System.DateTime.DaysInMonth(2009, 1) / 7.0); 

请注意,此小数点表示法总是产生一个double 。 要制作float ,您需要使用其类型后缀: 7f

顺便提一下,几乎所有语言的基本运算符的这种行为都是相同的。 一个值得注意的例外:VB,除法运算符通常产生一个Double 。 如果不需要转换,则有一个特殊的整数除法运算符( \ )。 另一个例外涉及C ++以一种奇怪的方式:相同类型的两个指针之间的区别是ptrdiff_t 。 这是有道理的,但它打破了运算符总是产生与其操作数相同类型的模式。 特别是,减去两个unsigned int不会产生signed int

将7改为双:

 (int) Math.Ceiling(System.DateTime.DaysInMonth(2009, 1) / 7.0); 

只用文字双倍划分:

 (int)Math.Ceiling((System.DateTime.DaysInMonth(2009, 1) / 7.0)) 

据我所知,你不能强制函数返回不同的类型,所以投射结果是你最好的选择。 将函数的结果转换为double然后除法应该可以解决问题。

扩展康拉德的答案……

将7改为7.0,7到7D,7到7M都可以得到你想要的答案。

对于完全不同的方法,完全避免了转换和浮点数学……

 int result = val1 / val2; if (val1 % val2 != 0) result++; 

所以,在你的情况下……

 int numDaysInMonth = System.DateTime.DaysInMonth(2009, 1); int numWeeksInMonth = numDaysInMonth / 7; if (numDaysInMonth % numWeeksInMonth != 0) numWeeksInMonth++; 

这种方法非常冗长,但可能会有一些特殊情况需要它。 从技术上讲,模数方法应该有轻微的性能优势,但是你很难测量它。

在你的情况下,我坚持接受的答案:-)