Ints和Doubles做分工

时间:2010-07-07 13:22:05

标签: c# .net double type-conversion

简短版本:为什么我不必强制60和int,进入一个double,这样如果我关心小数部分,我可以使用另一个double的除法?

长版本:我的老板用一行代码打电话给我。我测试了它并且它工作得非常好,但他认为我有一个等待发生的错误。

int durationinseconds = 61;  // This is actually filled from a double.tryparse 
                             // from a string value out of an xml doc.
int durationinminutes = (int)Math.Ceiling((double)durationinseconds / 60);

我的代码应该从XML文档中获取#秒,然后计算出分钟数,总是向上舍入。 60秒= 1分钟,61秒= 2分钟等等。

我已经测试了我的代码,但是他坚持认为“/ 60”部分应该是“/ 60.0”。

我已经用0,1,2,59,60,61,119,120,121,599,600,601等测试了我的代码,它总能正常工作。

在我为自己辩护之前,我大多理解为什么他认为我需要强制60为小数,因为他认为如果我使用int值,那么double / int将导致整数值,有效地放弃了小数部分。

然而,这并没有发生,我无法解释原因。所以,这是我的问题:如果我想使用小数部分,为什么我不必在使用60.0时使用60.0?

5 个答案:

答案 0 :(得分:10)

以下是相关的分部运营商:

public static double operator /(double x, double y)
public static int operator /(int x, int y)

intdouble进行隐式转换,但不是相反...所以,如果您将int除以int,那么' ll使用整数形式...但如果任一操作数是double,它将使用double形式。

没有必要同时制作两个操作数double - 但如果你将除数操作数设为double而不是强制转换,那么你的代码至少更短:

int durationInMinutes = (int) Math.Ceiling(durationInSeconds / 60.0);

就我个人而言,我觉得更容易阅读......但这是个人选择。

如果你想向你的老板证明它正在做浮点除法,在代码上使用iladsm或者反射器(在IL模式下) - 它会显示ldc.r8指令常量,表示double值。

答案 1 :(得分:3)

将double除以整数将导致double。

不需要60.0。您可以使用60.0并删除双重演员。无需使用两者。这完全是多余的。

答案 2 :(得分:3)

你是对的。 int 60会自动提升为double。写60.0是正确的,但是多余的。

C#语言规范,“7.2.6.2二进制数字促销”:http://msdn.microsoft.com/en-us/library/aa691330.aspx

答案 3 :(得分:1)

转换durationInSeconds就足够了。它将产生一个双倍,并将最多为2。

答案 4 :(得分:1)

您不能将double除以整数,因此编译器会将整数转换为double。

因此,表达式(double)durationinseconds / 60(double)durationinseconds / 60.0将导致创建相同的代码。

在这种情况下,我更喜欢使用60.0,以使代码实际上更加明显。