在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++;
这种方法非常冗长,但可能会有一些特殊情况需要它。 从技术上讲,模数方法应该有轻微的性能优势,但是你很难测量它。
在你的情况下,我坚持接受的答案:-)