只是一个简单的问题,我可能会因为询问而感到愚蠢,但仍然想知道为什么会这样......!
无论如何,快速举例:
x is a double.
double conversion = (x-32)*5/9;
这样的数学就好了。
double conversion = (x-32)*(5/9);
这不是很好,因为(5/9)被视为一个int,因此结果总体为0.
double conversion = (x-32)*(5f/9f);
这样可以很好地计算数学,因为它明确地使5/9值成为浮点数。
所以我的问题是:为什么第一个方程式完美无缺? (double conversion = (x-32)*5/9;
)
如果5/9被认为是一个int,为什么不是0/9?是什么让5/9与(5/9)不同?
答案 0 :(得分:4)
区别在于您先进行乘法还是先进行除法 - 以及这些操作的类型是什么。
此:
(x - 32) * 5 / 9
相当于:
((x - 32) * 5) / 9
因此,如果x
的类型为double
,则x - 32
的类型为double
,因此5
会提升为double
},乘法在double
算术中完成,得到double
结果,然后除法也在double
算术中完成。
即使x
是整数类型,你首先进行乘法,这可能会给你一个大于9的值(在你的测试用例中),非零结果。例如,如果x
为45,则x-32
为13,(x - 32) * 5
为65,整体结果为7,然后在分配时转换为7.0。如果x
是double
且值为45.0,那么这个结果就不一样了,但它仍然比乘以0更好......
答案 1 :(得分:0)
你基本上回答了自己的问题。评估顺序完全不同。
基本的从左到右的评估结果与第二个示例中的显式评估顺序不同类型转换
答案 2 :(得分:0)
假设x
是double
,那么由于操作顺序,您的第一个等式将双精度除以整数。
(x-32) = y
- > y*5 = z
- > z/9
在每个阶段操作一个double,覆盖整数运算。
答案 3 :(得分:0)
这是它完成的顺序。
如果乘以5,则得到一个大数。如果你除以9,你仍然得到int
,
但其余部分被丢弃了。
答案 4 :(得分:0)
原因是操作的顺序。
(x-32)* 5/9使第一个(x-32)* 5然后将结果除以9
(x-32)*(5/9)首先(x-32)和(5/9)。两个结果相乘后。
答案 5 :(得分:0)
你的x的值可能是两倍,并且它将整个等式设为double,因为括号首先执行。
答案 6 :(得分:0)
这是转换何时发生的问题。 5/9
由一个5和一个9(两个整数)组成integer division。如果其中任何一个是float
(5f/9
或5/9f
),则它们将划为浮点数。