Mat*_*att 4 .net c# 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);
Run Code Online (Sandbox Code Playgroud)
我的代码应该从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?
Jon*_*eet 10
以下是相关的分部运营商:
public static double operator /(double x, double y)
public static int operator /(int x, int y)
Run Code Online (Sandbox Code Playgroud)
有一个隐式转换从int到double,而不是倒过来...因此,如果你把一个int通过int,你会使用整数形式......但如果操作数是双,它将使用双形式.
有没有必要做两个操作数double-但你的代码会,如果你做除数操作数双,而不是铸造至少短:
int durationInMinutes = (int) Math.Ceiling(durationInSeconds / 60.0);
Run Code Online (Sandbox Code Playgroud)
就个人而言,我发现更容易阅读......但这是个人选择.
如果你想证明给你的老板,它的真正做浮点除法,你的代码中使用iladsm或反射器(在IL模式) -它会显示一个ldc.r8为恒指令,这意味着double价值.