Ошибка с делением с использованием двойного типа в Java - PullRequest
5 голосов
/ 16 февраля 2010

Хорошо. Я уже 2 часа бьюсь головой о стену, пытаясь понять, почему в мире double answer = 364/365; говорит мне, что answer равно 0. Или любая другая комбинация double в этом отношении, просто усекается десятичная дробь, и я просто не знаю почему.

Ответы [ 5 ]

9 голосов
/ 16 февраля 2010

364/365 выполняет целочисленное деление (усекает десятичное число).

Попробуйте double answer = 364.0/365; заставить его выполнить деление с плавающей запятой.

Что-то вроде:

double days_in_year = 365;
double answer = 364/days_in_year;

также будет работать, так как один из операндов не является целым числом.

6 голосов
/ 16 февраля 2010

Вы берете тип int (364) и делитесь на другой тип int (365) - ответ будет int. Затем он сохраняется в ответе двойного типа. Вы можете сделать следующее:

double answer = 364d / 365d;

Подробнее здесь:

http://mindprod.com/jgloss/division.html

2 голосов
/ 16 февраля 2010

Вам нужно сделать двойное деление. Сейчас Java интерпретирует это как целочисленное деление и возвращает усеченное int.

Что вам нужно:

double answer = 364 / 365.0;

или

double answer = 364 / (double) 365; 
0 голосов
/ 29 июня 2019

Все вышеприведенные ответы верны, просто хочу добавить, что это все о GIGO.

double answer = 364/365;

в вышеприведенном коде двойной тип подразумевает только ответ переменной, а арифметическое выражение имеет оба операнда типа int. Таким образом, выходные данные арифметического выражения также имеют тип int, который затем через автоматическое приведение к типу double дает результат 0.0, как показано в следующих примерах:

double ans = 4.0/0;

вышеприведенный код будет выдавать бесконечность, поскольку один из операндов является числом с плавающей точкой, поэтому при автоматическом приведении типа 0 преобразуется в 0,0, а результат соответствует типу данных с плавающей точкой.

тогда

double ans = 4/0;

выдаст исключение java.lang.ArithmeticException: / с нулевым исключением во время выполнения, поскольку оба операнда имеют тип данных int и, следовательно, выходные данные соответствуют типу данных Integer, независимо от того, является ли тип переменной данных типа double двойным.

0 голосов
/ 16 февраля 2010

Причина в том, что по умолчанию тип целочисленных литералов в java равен int, а весь результат всей арифметики, основанной на int, приведен к типу int.Следовательно, хотя ваш ответ 0,997, когда он задан обратно, он становится 0:

(int)0.997  = 0

Таким образом, вы можете сделать так:

364.0/365.0

или

((float)364)/365
...