2017-10-24 11 views
1
#include <stdio.h> 
int main() { 
double x = 10.4, y; 
int m = 2; 
y = x/m; 

printf("%.1f\n", y);//5.2 
printf("%.1f\n", (double)(7/2)); //3.0, why not 3.5 ? 
printf("%.1f\n", 3.5f);//3.5 
// the last line prints 3.5, 
// why its not rounding down to 3.0 ,as it did above ? 
} 

ここで何が起きているのか説明できる人はいますか?ラインprintf("%.1f\n", (double)(7/2));Cダブルフォーマッタのプレースホルダーの理解

+0

@LưuVĩnhPhúc私もその1つを見て、感謝! –

答えて

3

次のように、動作の順序は次のとおりです

  1. 7/2 = 3
  2. (double)3 = 3.0
  3. printf("%.1f\n", 3.0);// Your problem becomes evident.

予想される動作を達成するために、7.0/2
(double)(7/2)を変更(すなわち、printf("%.1f\n", 7.0/2);あなたのコードは正しく3.5を印刷します)。

7/2は、integer divisionと同じように、結果を3に自動的に切り捨てます。その後、整数除算の結果をにキャストして3.0を生成します。数式の数値の1つがdoubleである場合、これらの問題はすべて避けられます。次に、もう1つは暗黙的にdoubleにキャストされ、結果としてdoubleが生成されます。

3

printf("%.1f\n", (double)(7/2));からprintf("%.1f\n", (double)(7.0/2));に変更して、目的の結果が得られます。 7.0は結果を倍にします。