Я писал этот код:
public static void main(String[] args) {
double g = 1 / 3;
System.out.printf("%.2f", g);
}
Результат - 0. Почему и как решить эту проблему?
java
integer-division
Тофик
источник
источник
int i = .99999999
устанавливает int в 0. Точнее говоря, он берет целую часть и отбрасывает остальное.DOWN
идет в сторону нуля. ОкруглениеFLOOR
в сторону отрицательной бесконечности.1/3
использует целочисленное деление, поскольку обе стороны являются целыми числами.Вам нужно, чтобы хотя бы один из них был
float
илиdouble
.Если вы вводите значения в исходный код, как ваш вопрос, вы можете сделать это
1.0/3
;1.0
является двойной.Если вы получаете значения из других источников, вы можете использовать их
(double)
дляint
преобразования вdouble
.источник
Явно приведите его как
double
Это происходит потому, что Java использует операцию целочисленного деления для
1
и,3
поскольку вы ввели их как целочисленные константы.источник
вы должны использовать
или
Целочисленное деление возвращает целое число.
источник
Потому что вы делаете целочисленное деление.
Как говорит @Noldorin, если оба оператора являются целыми числами, используется целочисленное деление.
Результат 0,33333333 не может быть представлен как целое число, поэтому результату присваивается только целая часть (0).
Если какой-либо из операторов - это
double
/float
, то будет выполняться арифметика с плавающей запятой. Но у вас будет та же проблема, если вы это сделаете:источник
Потому что он обрабатывает 1 и 3 как целые числа, поэтому результат округляется до 0, так что это целое число.
Чтобы получить результат, который вы ищете, явно сообщите java, что числа удваиваются, например:
источник
Сделайте 1 числом с плавающей запятой, и будет использоваться деление с плавающей запятой
источник
Преобразование в JAVA довольно простое, но требует некоторого понимания. Как объясняется в JLS для целочисленных операций :
И пример - всегда лучший способ перевести JLS;)
Небольшой пример с использованием Eclipse, показывающий, что даже сложение двух
short
s не так просто:Это потребует отливки с возможной потерей точности.
То же верно и для операторов с плавающей запятой.
Таким образом, продвижение происходит на поплавке в два раза.
И сочетание целого и плавающего значения приводит к плавающим значениям, как сказано
Это верно для бинарных операторов, но не для «операторов присваивания», таких как
+=
Достаточно простого рабочего примера, чтобы доказать это
Причина в том, что здесь выполняется неявное приведение, это будет выполняться как
источник
1 и 3 являются целочисленными константами, поэтому Java выполняет целочисленное деление, результатом которого является 0. Если вы хотите написать двойные константы, вы должны написать
1.0
и3.0
.источник
Самое простое решение - просто сделать это
Что это значит, поскольку вы не вводили 1.0 / 3.0, это позволяет вам вручную преобразовать его в тип данных double, поскольку Java предполагала, что это целочисленное деление, и будет делать это, даже если это означает сужение преобразования. Это то, что называется оператором приведения.
источник
Я сделал это.
Используйте .0 при выполнении двойных вычислений, иначе Java будет предполагать, что вы используете целые числа. Если в вычислении используется любое количество двойных значений, то на выходе будет двойное значение. Если все целые числа, то на выходе будет целое число.
источник
(1/3) означает целочисленное деление, поэтому вы не можете получить десятичное значение из этого деления. Для решения этой проблемы используйте:
источник
Поскольку и 1, и 3 являются целыми числами, результат не округляется, а усекается. Таким образом, вы игнорируете дроби и берете только целые.
Чтобы избежать этого, используйте хотя бы одно из ваших чисел 1 или 3 в десятичной форме 1.0 и / или 3.0.
источник
Попробуйте это:
источник
Сделайте «двойной г = 1.0 / 3.0;» вместо.
источник
Многие другие не смогли указать на настоящую проблему:
Это обязательно означает, что результаты с плавающей запятой, которые могут отображаться как целые числа, будут усечены (отсечена десятичная часть).
Что такое приведение типов / преобразование типов, спросите вы?
Это зависит от реализации языка, но Википедия имеет довольно исчерпывающий обзор, и в ней также говорится о принуждении , что является ключевой информацией при ответе на ваш вопрос.
http://en.wikipedia.org/wiki/Type_conversion
источник
1/2
, в целевом языке (java). Вы просто вызываете целочисленное деление, которое приводит к целочисленному результату. Приведение типа происходит только из-за повышающего преобразования изint
вdouble
во время присвоения.0.5
. Проще говоря, в Java1/2
это целочисленное деление, которое дает нулевое целое число. Вы можете присвоить дублю ноль, он все равно будет нулем, хотя и0.0
двойным.