C# 在C中使除法返回加倍的最佳实践是什么#

C# 在C中使除法返回加倍的最佳实践是什么#,c#,C#,在c#中,当您要对如下方法的结果进行除法时,强制它返回双精度值而不是默认整数的最佳方法是什么 (int)Math.Ceiling((double)(System.DateTime.DaysInMonth(2009, 1) / 7)); 正如你所看到的,我需要除法返回一个双精度,这样我就可以使用天花板函数。据我所知,你不能强制函数返回不同的类型,所以铸造结果是你最好的选择。将函数的结果强制转换为双精度,然后再进行除法就可以了。两个int数字的除法返回一个int,截断任何小数点。其他数据类型通常也

在c#中,当您要对如下方法的结果进行除法时,强制它返回双精度值而不是默认整数的最佳方法是什么

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

正如你所看到的,我需要除法返回一个双精度,这样我就可以使用天花板函数。

据我所知,你不能强制函数返回不同的类型,所以铸造结果是你最好的选择。将函数的结果强制转换为双精度,然后再进行除法就可以了。

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

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

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

这可以使用类型后缀(
d
(如果是
double
),或者在其后面写一个小数点。后一种方式通常是首选的。就你而言:

(int)Math.Ceiling(System.DateTime.DaysInMonth(2009, 1) / 7.0);
请注意,此小数点表示法总是产生一个
双精度
。要使
浮动
,需要使用其类型后缀:
7f


顺便说一句,基本运算符的这种行为几乎适用于所有语言。一个值得注意的例外是VB,其中除法运算符通常产生一个
Double
。如果不需要转换,则有一个特殊的整数除法运算符(
\
)。另一个异常以C++的方式关注C++:同一类型的两个指针之间的差异是<代码> pTrDeFifft 。这是有道理的,但它打破了运算符总是产生与其操作数相同类型的模式。特别是,减去两个
无符号整数
不会产生一个
有符号整数

将7更改为双精度:

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

只需使用文本双精度除法:

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

要扩展康拉德的答案


将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++;
这种方法非常冗长,但在某些特殊情况下可能更可取。从技术上讲,模数方法应该有轻微的性能优势,但您很难测量它


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

啊,谢谢,这让我很困惑,因为我来自vb背景,同一行代码在vb.net中按预期工作,但在c#中没有。我改变了括号来强制转换第一个操作数,它工作了。用7d代替显式强制转换工作,效果会更好吗?@Daniel,SixlettVariables:你当然是对的,我失败了(尽管我永远不会用后缀
D
来表示双精度,因为这是多余的:相反,我建议写7.0)。然而,其他人已经回答了这个问题。我想我们可以共存。哈,没想到我在那里放了个“d”,所以我支持你的“7.0”!伙计们,你们已经如愿以偿了。我完全重写了条目。我还把它做成了一个社区维基。你不再需要双重角色了……什么?我认为问题在于如何使用浮点除法而不是整数除法。在C#中,将一个int除以一个int总是返回一个int。要使用fp除法,必须将double除法。由于不能使函数返回double,因此必须将函数的返回值强制转换为double,或使除数为double。