42の値を返す必要があるのになぜこれが0を返し続けるのか誰かが私に説明できますか?それは紙の上で機能するので、数学が正しいことを知っています。なぜそれが翻訳されないのか疑問に思っていますか?
int a = 60;
int b = 120;
int c = 85;
int progress;
progress = ((c-a)/(b-a))*100;
NSLog(@"Progess = %d %%",progress);
42の値を返す必要があるのになぜこれが0を返し続けるのか誰かが私に説明できますか?それは紙の上で機能するので、数学が正しいことを知っています。なぜそれが翻訳されないのか疑問に思っていますか?
int a = 60;
int b = 120;
int c = 85;
int progress;
progress = ((c-a)/(b-a))*100;
NSLog(@"Progess = %d %%",progress);
それはあなたの数学がすべて整数を使用しているからです。
特に、内部式は25/60を計算しています。これは、整数演算ではゼロです。
事実上、式を括弧で囲みすぎており、結果として得られる評価の順序が整数の丸めの問題を引き起こしています。
あなたがちょうど式を書いていたらそれはうまくいったでしょう:
progress = 100 * (c - a) / (b - a);
100 *(c --a)は最初に2500と評価され、次に60で除算されて41になるためです。
あるいは、変数、、、またはのいずれか1つ(またはそれ以上)がa
(b
またはc
それfloat
にキャストされた)場合、方程式も機能します。
これは、いずれかのオペランドがaである式float
によって、もう一方の(整数)オペランドもにプロモートされ、float
その時点で式の結果も。になるためfloat
です。
c - a
あなたに25を与えます
b - a
あなたに60を与えます
a
、、、b
およびはすべて整数であるため、c
小数にすることはできません。したがって、を(c-a)/(b-a)
実行すると、0.41666666ではなく0が得られます。これは、整数除算では、小数点以下が切り捨てられ、小数点前の数値が残るためです。
希望どおりに機能させるには、キャストを試し(c-a)
て(b-a)
、ダブルまたはフロートする必要があります。
progress = ((float)(c-a) / (float)(b-a)) * 100;
また
progress = ((double)(c-a) / (double)(b-a)) * 100;
a
、b
およびc
はint
sです。を計算する((c-a)/(b-a))
と、結果もint
;になります。実際の値は10進数(0.42)ですが、int
は10進数を取ることができないため、に丸められ0
、これに乗算されて。100
が得られます0
。
(c - a) / (b - a)
を使用して計算されるためinteger math
。
修正するには、分割する前にフロートにキャストします。
progress = (int)((((float)(c - a)) / ((float)(b - a))) * 100);