简短版本:为什么我不必强制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?
答案 0 :(得分:10)
以下是相关的分部运营商:
public static double operator /(double x, double y)
public static int operator /(int x, int y)
从int
到double
进行隐式转换,但不是相反...所以,如果您将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
,以使代码实际上更加明显。