Проблема с печатью значения длинного деления и умножения

Мне трудно понять, почему простое деление, подобное этому, всегда возвращает 0.

System.out.println(4091365376L / 4091495462L * 100L);

Я добавил ко всем числам суффикс L, чтобы они считались длинными. Я продолжаю получать ноль.

Я пытаюсь рассчитать процент от 4091365376L до 4091495462L. Мои значения - Longs, но я просто ищу простое целочисленное значение.


person Mridang Agarwalla    schedule 18.06.2012    source источник
comment
Это было какое-то время в Java, но я думаю, что вам нужно использовать символ%, чтобы вернуть мод.   -  person BillyNair    schedule 18.06.2012


Ответы (4)


Вы стали жертвой целочисленного округления (на самом деле: усечения). Попробуй это:

System.out.println(4091365376L * 100L / 4091495462L);

Печатает 99. Или неявно привести к double:

System.out.println(100.0 * 4091365376L / 4091495462L);

Даю 99.99682057572328. Ваша проблема в том, что 4091495462L немного больше, чем 4091365376L, поэтому при погружении в них результат усекается до 0 (попробуйте 3 / 4, если вы не уверены). и 0 раз 100 равно...

person Tomasz Nurkiewicz    schedule 18.06.2012

4091365376L / 4091495462L * 100L
\_______________________/       |
      0.99... = 0               |
      \_________________________/
                    0

Вы могли бы выразить это как

100 * 4091365376L / 4091495462L

тогда это станет

100 * 4091365376L / 4091495462L
\_______________/              |
  409136537600L                |
  \____________________________/
          99.99... = 99  
person aioobe    schedule 18.06.2012
comment
Мне нравятся ASCII-диаграммы. В таких случаях это действительно облегчает жизнь. Спасибо. - person Mridang Agarwalla; 18.06.2012

Порядок важен, как и тип. Вывод длинного, деленного на длинное, является длинным. Результат выполняемого вами деления равен 0, а 0 * 100 == 0. Было бы гораздо лучше использовать что-то вроде этого:

System.out.println((long) (4091365376.0 / 4091495462.0 * 100));
person Wug    schedule 18.06.2012

В целочисленной математике:

4091365376 / 4091495462 = 0
0 * 100 = 0

Вы ожидаете

4091365376 / 4091495462 = 0.9999682057572327
0.9999682057572327 * 100 = 99.99682057572327

но вы не можете сделать это с целыми числами (или длинными целыми числами). Используйте двойные значения, если вы хотите двойное значение.

person Jonathon Faust    schedule 18.06.2012