0

整数に対していくつかの算術演算を実行しようとしています。問題は、結果として double を取得するために除算を実行しようとすると、結果は常に 0.0000000000000000000 になりますが、((7 * 207) / 6790) のようなものには明らかに当てはまりません。式を型キャストしようとしましたが、それでも同じ結果が得られます。

私は何を間違っていますか?どうすれば修正できますか?

int o12 = 7, o21 = 207, numTokens = 6790;
double e11 = ((o12 * o21) / numTokens);
printf(".%20lf", e11); // prints 0.00000000000000000000
4

4 に答える 4

3

実際の値に関係なく、次のことが当てはまります。

int / int = int

出力は非int型に自動的にキャストされません。

intしたがって、除算を行うと、出力は anにフロアされます。

あなたがしたいことは、これらのいずれかを強制的に発生させることです:

double / int = double
float / int = float
int / double = double
int / float = float

上記には、自動拡張変換が含まれます。浮動小数点値である必要があるのは 1 つだけであることに注意してください。

これは、次のいずれかで実行できます。

  • 値の 1 つの前に(double)またはを配置(float)して、対応する型または
  • 1 つ以上の変数をdoubleまたはに変更するfloat

キャスト like(double)(int / int)は機能しないことに注意してください。これは最初に整数除算を行い (これは を返すためint、値を切り捨てます)、次に結果を にキャストします (これは、何も指定せずdoubleに単純に a に代入しようとするのと同じです)。doubleあなたがしたように、キャストします)。

于 2013-02-22T10:26:33.083 に答える
1

((7 * 207) / 6790)結果が である0、または0.0で考えた場合などの式については、確かに当てはまりますdouble

式には整数しかないため、整数の乗算とそれに続く整数の除算として計算されます。

それを変更するには、浮動小数点型にキャストする必要があります((7 * 207) / 6790.0)

多くの人は、代入の右辺がターゲット変数の型によって自動的に「調整」されることを期待しているようです: これはどのように機能するかではありません。結果は変換されますが、右側の式の「内部」操作には影響しません。あなたのコードで:

e11 = ((o12 * o21) / numTokens);

o12o21、はすべてnumTokens整数であるため、 は であるため、式は整数として評価され、浮動小数点に変換されe11ますdouble

このように

const double a_quarter = 1 / 4;

これは、同じ問題の単純なケースです。最初に式が評価され、次に結果 (整数0) が double に変換されて格納されます。それが言語の仕組みです。

修正はキャストすることです:

e11 = ((o12 * o21) / (double) numTokens);
于 2013-02-22T10:24:46.507 に答える
0

doubleこれらの数値は除算前にキャストする必要があります。除算を実行するとint、結果もゼロに向かって丸められた整数になり1 / 2 == 0ます1.0 / 2.0 == 0.5

于 2013-02-22T10:25:16.533 に答える
0

オペランドが整数の場合、C は整数演算を実行します。つまり、1/4 == 0. ただし、オペランドを強制的に にするとdouble、算術では小数部分が考慮されます。そう:

int a = 1;
int b = 4;
double c = 1.0

double d = a/b;         // d == 0.0
double e = c/b;         // e == 0.25
double f = (double)a/b; // f == 0.25
于 2013-02-22T10:25:45.063 に答える