0

ちょっとした数学から始めましょう。

目標体重 = 8.4 現在の体重 = 9.1 現在の体重 - 目標体重 = 0.7 (そう思うでしょう)

if( obj != null && obj.targetWeight != null && obj.currentWeight != null) {
            try {
                double i = Double.parseDouble( obj.targetWeight );
                double o = Double.parseDouble( obj.currentWeight);
                //do something if target weight is a number
                if(i>o){
                    outputEditText.setText ("Congratulations. you have passed your target weight");
                }
                else if (i<o){
                    outputEditText.setText(
                            "Your Target Weight is " + obj.targetWeight +obj.unit + "\n" + 
                                    "Your Current Weight is " + obj.currentWeight + "\n" +
                                    "Difference is " + (o - i));
                }

上記によると 8.4-9.1 = 0.6999999999999993

ターゲットと現在の重みは両方とも、double として解析されるユーザー提供の入力です。

誰かが私が間違っていることを知っていますか

どうもありがとう

4

3 に答える 3

4

あなたは何も悪いことをしていません。浮動小数点演算の素晴らしい世界へようこそ! 私たちにさえ、きれいに見える多くの数は、実際にはコンピューターで使用される 2 進数システムでは正確に表現できません。

当面の問題に対する答えは、フォーマットです。生の倍精度数を単純に出力することはできません。たとえば、適切な小数点以下の桁数を表示するには、常に使用する必要があります。DecimalFormat(たとえば) 小数点以下 5 桁に丸められた数値は、 0.7 として出力されます。

于 2012-04-11T13:47:06.253 に答える
1

すべての 10 進数 (つまり double) を基数 2 で完全に表現できるわけではありません。.6999999... の出力は、入力の近似基数 2 表現を使用した減算のコンピューターの最適近似です。

于 2012-04-11T13:50:09.040 に答える
0

皆様のご回答ありがとうございます。

機械の世界は私の脳がどのように考えるかとは異なることがわかりました。

これが私の問題を解決するために私がしたことです。

DecimalFormat df = new DecimalFormat("####.##"); 

                    String b = df.format(o-i);
于 2012-04-11T14:26:58.343 に答える