2009-03-05 9 views
4

を期待通りに動作しない(はるかに大きい機能の一部が、これは、関連するテストビットです):C数学計算は、私はプログラムの中で、以下のいる

x = a + (a * (b/100)) 
:基本的にそれはになる

int test = 100 + (100 * (9/100)); 
sprintf (buf, "Test: %d\n\r", test); 
display_to_pc (buf, player); 

ここでaは与えられた数字であり、bはパーセンテージ修正子であり、xは結果(オリジナルとオリジナルのパーセンテージ)です。

それは私を与える:私は私の頭の中で数学が間違っているかもしれないと思ったが、私は私のIDEでいくつかの電卓とさえ式評価をチェックしました、と彼らはすべて私に期待される結果が得られ

Test: 100 

最初の式は109です。

私がここで紛失しているものについて誰でも教えてもらえますか?

ありがとうございました。 :

+0

整数のみで算術演算を使用すると、その結果がどのように評価されるかを確認する必要があります。分数ではなく整数が9になる頻度を考える。 –

答えて

14

交換ゼロである

int test = 100 + (100 * (9/100)); 

int test = 100 + (100 * 9/100); 
// x = a + (a * b/100) 

と期待どおりに動作します。 9/100は整数除算を使用して実行されます。 .09への最も近い整数は0(かつ0 * 100は依然として0です)です。

最初に乗算を行うと900/100となり、これはあなたが期待していた9を与えます。

整数以上の精度が必要な場合は、浮動小数点ルートに移動する必要があります。

+0

明示的なキャストを行う方が良いと思います。また、評価の順序に応じて浮動小数点定数を使用するほうが、コードをリファクタリングした方が壊れやすくなります。少なくとも浮動小数点である必要がある次のプログラマ(あなたになる可能性のある人)に明示的なキャストを行うことは少なくとも警告します。 – tvanfosson

+0

私は分かりません。私は「分裂する前に乗算する」スケーリングを行ってきました(明らかにオーバーフローしない数字については)私にとってかなり自然なようです。私はそれを避けることができればFPに入ることはしないでください。私はこの場合の注意が賢明であることに同意するでしょう。 –

+0

@tvanfosson:誰かが操作の順序を変更した場合、コードの動作が変更されています。誰もそれをして、それが同じように働くことを期待していません。浮動小数点である必要はありません。時には整数の計算が必要な場合もありますが、これはその時のようです。 – rmeador

3

int test = 100 +(100 *(9/100));

9/100 = 0

0 * 100 = 0

100 + 0 = 100

1

、9月10日の答えが0に切り捨てられ、その後、あなたは100であることを乗算100を追加します。

8

整数演算を使用しています。

9/100 = 0

100 +(100 *(0)100

あなたの電卓は、浮動小数点演算を使用して、適切に小数を扱うことができます=。

2

あなたは整数を使用しています分割はそう100分の9はそうtest = 100 + 0 = 100

3

あなたの間違いは、9/100が整数除算と解釈され、0.09ではなく0に評価されることです。

9/100を書くことができます。0を代入するか、式を再配置します。

4

他の人が指摘しているように、問題はあなたが整数計算をしているということです。変数をdouble型にキャストするかdouble型定数を使用して浮動小数点として計算する必要があります。次に、整数部分だけを切り捨てることができます。

x = a + (a * (b/100.0)); 

または

x = a + (a * ((double)b/100))); 
1

変更:

int test = (int)(100 + (100 * (9/100.0))); 

と期待どおりに動作するかどうかを確認する

int test = 100 + (100 * (9/100)); 

EDIT:うわー。私が入力している間に多くの答え。彼らの大半は働くでしょう。

1

9/100が0.09になるように、浮動小数点演算を使用する必要があります。

int test = 100.0 +(100.0 * 9.0/100.0);

2

整数値が整数になる式だけを扱う場合は、Daniel Lの答えを使用します。あなたが作業になります値があまりきれいであれば、代わりに整数リテラルの二重のリテラルを使用します。

int test = 100.0 + (100.0 * (9.0/100.0)); 
0

をあなたは、変数の型のための整数値を使用しているので、最も内側の式(9/100)になります0その後、次の式が0である* 0 100、そして最終的に100 + 0 ...

ご希望の結果が代わりにフロートを使用してみてください取得するには、次のようになります。

フロートテスト= 100.0 +(100.0 *(9.0/100.0));

printf( "result:%0.2f \ n"、test);

関連する問題