2016-09-18 4 views
0

Я пытаюсь вычислить формулу в Android:Расчет дает различные результаты

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

Значение absence является 4, неделя 2 и период 2. percent возвращение 11.111111.

Но если я делаю то же самое в Excel с формулой 4/(2*(37/2))*100, он возвращает 10.81.

Может ли кто-нибудь объяснить мне, что может быть неправильным?

+1

Потому что целое деление. – Li357

+0

добавить объявление своих переменных, но, скорее всего, они являются ints – Turo

+0

@AndrewL Да, одна из переменных (период) была целочисленной, поскольку они содержат только 1 или 2. Упомяните, почему это работает таким образом в кодировании, когда остальные Двойной? – janlindso

ответ

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 видит, что существует два целых числа и разделяются, поэтому он использует целочисленное деление. Это приводит к удалению всех дробных частей, что означает, что 0,5 из 18,5 в результате 37/2 удаляется, что делает результаты разными.

Fix

Вы можете «исправить» это, сделав по крайней мере один из операндов в поплавок деления или двойной:

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

Что это будет сделать, это достичь деление с плавающей точкой дает 10.8108 ...

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 на intperiod. Если вы измените его на double, он даст вам ожидаемый результат.

Смежные вопросы