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

目标权重和当前权重都是用户提供的输入,被解析为双精度。

有谁知道我做错了什么

非常感谢

4

3 回答 3

4

你没有做错什么。欢迎来到浮点运算的美妙世界!许多看起来不错的数字,甚至对我们来说,实际上都不能在您的计算机使用的二进制数字系统中准确表示。

您当前问题的答案是格式化。您永远不能简单地打印原始双精度数字;例如,您总是必须使用DecimalFormat适当的小数位数。您的数字(例如)四舍五入到小数点后五位,将打印为 0.7 。

于 2012-04-11T13:47:06.253 回答
1

并非所有小数(即双精度数)都可以以 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 回答