计算给出不同的结果

时间:2016-09-18 15:41:06

标签: java android

我试图在Android中计算公式:

percent = absence/(week*(37/period))*100;

absence的值为4,周为2,期间为2percent会返回11.111111

但如果我在Excel中使用公式4/(2*(37/2))*100执行相同操作,则返回10.81

任何人都可以解释一下可能出现的问题吗?

2 个答案:

答案 0 :(得分:1)

这是因为整数除法。

  

缺席值为4,星期为2,期间为2.%返回11.111111。

这是因为37/2是18.5,并且由于整数除法而将小数部分抛出。这得到18,乘以2是36.接下来我们将4除以36,即0.111 ...乘以100是11.111 ....

  

但如果我在Excel中使用公式4 /(2 *(37/2))* 100执行相同操作,则返回10.81。

这是因为Excel不使用整数除法。 37/2是18.5,18.5 * 2是37. 4/37是0.108108108 ...因此乘以100得到大约10.81。

<强>解释

它进行整数除法的原因是因为你有一个整数period。 Java看到有两个整数并且正在被分割,因此它使用整数除法。这会导致所有小数部分被删除,这意味着从37/2导致的18.5中的0.5被删除,从而使结果不同。

<强>修正

你可以通过使分区中的至少一个操作数浮动或加倍来“修复”这个:

double percent = absence/(week*((double) 37/period))*100;

这将实现浮点除法给出10.8108 ......

答案 1 :(得分:0)

将所有变量声明为double,它将按预期工作:

    public static void main(String[] args) {
        double period = 2;
        double absence = 4;
        double week = 2;
        double percent = absence /(week *(37/period ))*100;
        System.out.println("percent: " + percent);
    }

给出输出:

percent: 10.81081081081081

如果您的period变量被声明为int,您的输出将更改为:

percent: 11.11111111111111

这是因为当您将37除以int period时四舍五入会导致精确度下降。如果您将其更改为double,则会为您提供预期结果。