0

この状態では、'f'値は常に88から108になり、その値を0から200のシークバー範囲にマップする必要があります。

ここに示す私の式は、f = 88.1,88.2,89.1; 89.2 ....などの場合を除いて、すべての値で非常にうまく機能しています。

String value = b.getText().toString();

    float f= Float.parseFloat(value);


    int progress = (int) (f-(float)88.0)*10;
    s.setProgress( progress);

そして、シークバーで進行状況を設定すると、このようにfの値が返され、テキストビューが設定されます。

float channel = (float) ((float)88.0 + ((float)progress/10));
            String mytext=Float.toString(channel);
            t.setText(mytext);

しかし、textviewは私の元の値より0.1少ない値を示しています。たとえば、88.2の場合はf = 88.1、88.1の場合はf=88.0などです。

誰かが私がこれを解決するのを手伝ってくれる?

私は解決策を手に入れ、それを正しいとマークしましたが、なぜその奇妙なことが起こったのか誰かに教えてもらえますか?

4

2 に答える 2

2

反対のことを確認してみましたか。10を掛けてから、880を差し引いて、問題がまだここにあるかどうかを確認します。

int progress = (int) ((f*10) - 880);
于 2012-09-14T07:46:15.500 に答える
0

バイナリ浮動小数点は、すべての値を正確に表すわけではありません。特に、値88.1、88.2、89.1、および89.2は、2進浮動小数点では表現できません。代わりに、正確な数学的結果がこれらの値の1つになる計算または変換では、代わりに、正確な結果に近い2進浮動小数点値が生成されます。

通常のデフォルトモードでは、正確な結果に最も近い表現可能な結果が返されます。(これは、実行される各操作に対するものです。複数の算術演算がある場合、表現可能な結果への丸めの効果が複合し、より大きな差が生じる場合があります。)表現可能な結果が正確な結果よりも大きい場合と小さい場合があります。

したがって、オブジェクトfには88.1、88.2、89.1、または89.2は含まれていません。わずかに高いまたはわずかに低い他の値が含まれています。88を引いて10を掛けると、丸めの効果がキャンセルされて正確な結果が得られた場合、正確に1または2になる可能性がありますが、1または2よりわずかに高い値または値になる可能性があります。それは1または2よりわずかに低いです。

(int)次に、キャストを使用してその値を整数に変換します。この変換は切り捨てられます。丸めません。したがって、値が1よりわずかに低い場合、キャストの結果は0になります。

切り捨てではなく整数への変換を丸めたい場合は、.5を追加できますint progress = (int) ((f-88.f)*10 + .5);。(同点の場合に丸め方向を気にする場合、最も近い整数までの距離が完全に等しい場合は、別のソリューションを使用する必要があります。)

この丸めにより、この質問で尋ねる特定の問題が軽減されますが、アーティファクトが発生する可能性があります。たとえば、fが88.15のような値に非常に近い場合、それを丸めて1(.1の場合)または2(.2の場合)の進行状況を生成し、その進行状況からfを再構築すると、fがわずかに近い場合でも、88.2が生成される可能性があります。 〜88.1(88.15をわずかに下回る)、またはfが88.2にわずかに近い(88.15をわずかに超える)場合でも88.1を生成する可能性があります。

于 2012-09-14T13:15:36.620 に答える