2010-07-07 46 views
4

简短版本:为什么我不必将60和int强制为双精度型,这样如果我关心精度小数部分,我可以使用另一个double精度来进行除法运算?Ints and Doubles doing division

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

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?

回答

10

下面是相关的除法运算符:

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

有一个隐式转换从intdouble,而不是其他方式......所以如果你用intint,你将使用整数形式......但是如果任一操作数是双精度型,它将使用双精度型。

有没有必要做两个操作数double - 但你的代码,如果你做除数操作数双,而不是铸造至少短:

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

个人而言,我发现,更易于阅读。 ..但这是个人选择。

如果你想证明给你的老板,它的真正做浮点除法,你的代码中使用iladsm或反射器(在IL模式) - 它会显示为常数的ldc.r8指令,这意味着double值。

+0

简洁,完美地向他展示我不是一个白痴。为了清楚起见,我不想跑到他身边,说“我不对!”这是我第二周在这里,我想让他觉得我不是白痴。我很清楚可能因隐式投射和分割而失去精确性而产生的问题,但在我推动它之前,我也对其进行了充分测试,以确保我没有犯下愚蠢的错误。 再次感谢乔恩。我会提高你的答案和其他几个,但关于我的新工作的防火墙的一些事情使得无法使用openid登录。 – Matt 2010-07-07 13:54:53

+1

使用'60D'代替'60.0'是不是也是正确的?我不确定它的可读性/正确性,但看过几次。 – JYelton 2010-07-07 15:34:45

3

将整数除以整数将会导致双倍。

不需要60.0。相反,您可以使用60.0并放弃双击。无需使用两者。它是完全多余的。

+0

我会upvote你的答案,但有关我的新工作的防火墙正在使无法登录与openid。我承诺,在未来的某个时刻,我将通过限制较少的计算机进入Stackoverflow,从而让它升级。感谢你的回答。 – Matt 2010-07-07 13:56:03

1

转换你的durationInSeconds就足够了。它会产生一个双倍的,并且会舍入到2.

+0

我喜欢你的答案,但关于我的新工作的防火墙的一些事情使得用openid登录是不可能的。我承诺,在未来的某个时刻,我将通过限制较少的计算机进入Stackoverflow,从而让它升级。感谢你的回答。 – Matt 2010-07-07 13:57:13

3

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

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

+0

我会upvote你的答案,但有关我的新工作的防火墙正在使无法登录与openid。我承诺,在未来的某个时刻,我将通过限制较少的计算机进入Stackoverflow,从而让它升级。感谢你的回答。 – Matt 2010-07-07 13:56:32

1

你不能用一个整数来分割一个double,所以编译器会把这个整数转换为double。

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

我更喜欢在这种情况下使用60.0只是为了让它更清楚地知道代码实际在做什么。

+0

我会upvote你的答案,但有关我的新工作的防火墙使无法登录与openid。我承诺,在未来的某个时刻,我将通过限制较少的计算机进入Stackoverflow,从而让它升级。感谢你的回答。 – Matt 2010-07-07 13:58:00