2010-09-15 5 views
4
int cinema,dvd,pc,total; 
double fractionCinema, fractionOther; 
fractionCinema=(cinema/total)*100; //percent cinema 

Так что, когда я запускаю код для отображения fractionCinema, он просто дает мне нули. Если я изменю все ints на парные, то это даст мне то, что я ищу. Тем не менее, я использую кино, компьютер и все в другом месте, и они должны отображаться как ints, а не десятичные. Что я делаю?Beginners Java Question (int, float)

+0

См. [ Java Integer Division, как вы производите двойной? ] (http://stackoverflow.com/questions/3144610/java-integer-division-how-do-you-produce-a-double). –

+0

Nitpick от тяжелого опыта: не называйте это «fractionCinema», когда это действительно «percentCinema». Помогает спустя год стать очень запутанным! – user949300

ответ

13

Когда вы делите два ints (например, 2/3), Java выполняет целочисленное деление и усекает десятичную часть.
Следовательно, 2/3 == 0.

Вам необходимо заставить Java выполнить деление double путем литья любого операнда в double.

Например:

fractionCinema = (cinema/(double)total) * 100; 
+0

Нет необходимости форсировать арифметику с плавающей запятой, тем более, что OP говорит, что он не нуждается в ней на финальном дисплее. См. Мой ответ для целочисленного решения. –

2

При разделении двух int с, Java будет делать целочисленное деление, а дробная часть будет усечена.

Вы можете явно привести один из аргументов двойной через cinema/(double) total или неявно с помощью операции, такие как cinema*1.0/total

+1

Последний не работает из-за порядка операций. –

+0

@Matthew Good catch – NullUserException

+1

IMHO, второй пример, '* 1.0', который заставляет умножить просто преобразовать тип в double, является запахом кода. Лучше писать код, который разъясняет ваше намерение. «это нужно преобразовать в тип double» - это ваше намерение. Используйте '(double)' - для чего он нужен. ПРИЧИНА: Кто-то может легко прийти, увидеть умножение на 1.0 и подумать: «Это потерянное умножение, я собираюсь удалить его». Вы можете * добавить комментарий к кодовой строке: '//" * 1.0 "- это преобразовать в double'. Но это было бы глупо, когда желаемый оператор уже существует. – ToolmakerSteve

5

Попробуйте вместо этого:

int cinema, total; 
int fractionCinema; 

fractionCinema = cinema*100/total; //percent cinema 

Например, если cinema/(double)total составляет 0,5, то fractionCinema будет равно 50. И никаких операций с плавающей точкой не требуется; вся математика выполняется с использованием целочисленной арифметики.

Добавление

Как отметил @ user949300, код выше округляется до ближайшего целого числа. Для округления результата «правильно», используйте:

fractionCinema = (cinema*100 + 50)/total; //percent cinema 
+0

Предполагая, что OP хочет только целочисленные значения, это лучший ответ. («Я использую кино, компьютер и все в другом месте, и они должны быть _displayed_ _as_ _ints_, а не десятичными».) – qben

+0

Недостатком этого является то, что результат всегда округляется.Решение с плавающей точкой - это ИМО, лучше, так как оно будет «нормальным». Кроме того, nitpick, «fractionCinema» следует называть «percentCinema». – user949300

0

Как некоторые люди уже говорили, Java автоматически отсекать любые дробные части, делая деление целых чисел. Просто измените переменные из int в double.

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