Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/xpath/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 整数和双打除法_C#_.net_Double_Type Conversion - Fatal编程技术网

C# 整数和双打除法

C# 整数和双打除法,c#,.net,double,type-conversion,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

简短的版本:为什么我不强制将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将产生一个整数值,有效地去掉小数部分


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

将double除以一个整数将得到double


不需要60.0。您可以使用60.0并放弃双模式转换。不需要两者都使用。这是完全多余的。

转换持续时间秒就足够了。它将产生一个双精度,并将四舍五入到2。

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


C#语言规范,“7.2.6.2二进制数字提升”:

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

public static double operator /(double x, double y)
public static int operator /(int x, int y)
有一个从
int
double
的隐式转换,但不是相反。。。因此,如果将
int
除以
int
,将使用整数形式。。。但是,如果任一操作数是双精度的,它将使用双精度形式

无需将两个操作数都设置为双精度——但如果将除数操作数设置为双精度而不是强制转换,则代码至少会更短:

int durationInMinutes = (int) Math.Ceiling(durationInSeconds / 60.0);
就我个人而言,我觉得这更容易阅读。。。但这是个人的选择


如果你想向你的老板证明它真的在做浮点除法,那么在你的代码上使用iladsm或reflector(在IL模式下)——它会显示一条关于常数的
ldc.r8
指令,这意味着一个
double
值。

你不能将一个double除以一个整数,因此编译器会将整数转换为double

因此,表达式
(双)持续时间秒/60
(双)持续时间秒/60.0
将导致创建相同的代码


在这种情况下,我更喜欢使用
60.0
,只是为了让代码的实际功能更加清晰。

简洁、完美,向他表明我不是白痴。说清楚点,我不想跑到他面前说“不,不,我是对的!”这是我在这里的第二周,我想让他认为我不是白痴。我很清楚,隐式铸造和分割会导致精度下降,但在我推出它之前,我也对其进行了全面测试,以确保我没有犯愚蠢的错误。再次感谢你,乔恩。我会对你的答案和其他几个答案投赞成票,但是我新工作的防火墙让我无法用openid登录。用
60D
代替
60.0
难道不正确吗?我不确定它的可读性/正确性,但已经看过好几次了。我想对你的答案投赞成票,但我的新工作的防火墙使我无法使用openid登录。我保证,在将来的某个时候,当我从一台限制较少的计算机进入Stackoverflow时,我会把它投上去。谢谢你的回答。我会支持你的答案,但是我新工作的防火墙让我无法用openid登录。我保证,在将来的某个时候,当我从一台限制较少的计算机进入Stackoverflow时,我会把它投上去。谢谢你的回答。我会支持你的答案,但是我新工作的防火墙让我无法用openid登录。我保证,在将来的某个时候,当我从一台限制较少的计算机进入Stackoverflow时,我会把它投上去。谢谢你的回答。我会支持你的答案,但是我新工作的防火墙让我无法用openid登录。我保证,在将来的某个时候,当我从一台限制较少的计算机进入Stackoverflow时,我会把它投上去。谢谢你的回答。