2012-08-08 63 views
0

您认为这是一个错误还是预期的行为?隐式强制转换产生不正确的结果

考虑以下

1 * (2/(1+2)) 

    equals 0 

    1 * ((double)2/(1+2)) 

    equals 0.6667 
+2

没关系,因为在第一行有隐式转换为int。如果你想要使用double,你可以使用双数字格式'1 *(2.0 /(1 + 2)) ' – user854301 2012-08-08 05:48:30

+0

@ user854301:它看起来像编译器应该能够解决的问题。 – sgtz 2012-08-08 05:50:34

+0

只要你理解类型转换,它的预期行为:)对于许多新手来说它是一个混乱。总是指定转换:) – Zenwalker 2012-08-08 05:50:54

回答

3

这是不是一个错误。所有操作数为int的算术运算结果为int
这也是documented in the MSDN

当你把两个整数,结果始终是整数。例如,7/3的结果是2.要确定7/3的余数,请使用余数运算符(%)。要获得商数为有理数或分数,给予股息或除数类型float或double类型。您可以通过将小数点右边的小数点表示分数或除数来隐式地做到这一点

+0

这是从C++/C遇到的,还是C#独有的? – sgtz 2012-08-08 05:52:31

+1

@sgtz:在C,C++,Java等中是一样的 – 2012-08-08 05:52:57

1

你应该使用双/浮点数,如果你想在这个格式有结果:

1 * (2.0/(1+2)) 

1 * (2f/(1+2)) 

1 * (2d/(1+2)) 
相关问题