12

我注意到在另一篇文章中,有人做了类似的事情:

double d = 3.1415;
int i = Convert.ToInt32(Math.Floor(d));

他们为什么使用转换功能,而不是:

double d = 3.1415;
int i = (int)d;

它有一个隐式的地板和转换。

此外,更令人担忧的是,我注意到我正在阅读的一些生产代码:

double d = 3.1415;
float f = Convert.ToSingle(d);

是否与以下内容相同:

float f = (float)d;

所有其他隐式转换只是为了完整性而在 Convert 类中进行,还是有目的?我可以理解对 .ToString() 的需求,但不是其余的。

4

4 回答 4

12

转换为 int 是隐式截断,而不是隐式地板:

double d = -3.14;
int i = (int)d;
// i == -3

我选择 Math.Floor 或 Math.Round 以使我的意图更加明确。

于 2008-09-19T18:36:58.820 回答
3

舍入的处理方式也不同:

x=-2.5 (int)x=-2 Convert.ToInt32(x)=-2
x=-1.5 (int)x=-1 Convert.ToInt32(x)=-2
x=-0.5 (int)x= 0 Convert.ToInt32(x)= 0
x= 0.5 (int)x= 0 Convert.ToInt32(x)= 0
x= 1.5 (int)x= 1 Convert.ToInt32(x)= 2
x= 2.5 (int)x= 2 转换.ToInt32(x)= 2

注意 x=-1.5 和 x=1.5 的情况。
在某些算法中,使用的舍入方法对于获得正确答案至关重要。

于 2008-10-29T13:58:26.713 回答
1

当您有一个要转换为 int 的字符串时,您可以使用 Convert

int i = Convert.ToInt32("1234");

如果转换和强制转换失败,它们都会抛出异常。

即,这仍然会抛出异常,它不会返回 0:

Convert.ToInt32("1234NonNumber");

在许多情况下,转换和强制转换会产生相同的结果,但强制转换通常更容易阅读。

于 2008-09-19T18:10:55.077 回答
1

Convert.ToInt32() 用于字符串(http://msdn.microsoft.com/en-us/library/sf1aw27b.aspx),而强制转换只能用于具有内部转换器的类型(数字类型)。真正的诀窍在于在 Int32.Parse 和 Convert.ToInt32() 之间做出决定。Convert.ToInt32() 容忍空参数并返回 0,而 Int32.Parse() 将抛出 ArgumentNullException。

于 2008-09-20T02:26:43.823 回答