Что случилось с этим делением?

Вот код:

class testsum { public static void main(String arg[]) { double sum=0; double fraction; fraction=-1/9; System.out.println("fraction: "+fraction); fraction=-1; fraction=fraction/9; System.out.println("fraction: "+fraction); } } 

выходы равны 0 а затем -0.11111111

почему был первый выход 0 а не -0.11111111111 ?

Он выполняет целочисленное деление в первом примере, так как это тип по умолчанию для числового литерала. Попробуйте изменить его на -1.0/9 (или 1d/9d – суффикс d указывает на double ), и вы должны получить тот же ответ.

1 и 9 являются целыми. Пытаться

 1.0/9 

Вот почему он работает для fraction/9 , так как fraction является двойной.

Когда вы делаете -1/9, он говорит «-1», это int. 9, это int. -1 / 9 в целых делениях 0. О, теперь мне нужно сделать двойным ».

Изменение проблемы до -1.0 / 9 должно решить проблему.

Попробуйте обернуть «-1/9» в скобках.

Первый – 0, потому что он выполняет целочисленное деление. -1 и 9 и целые числа, а при делении равны 0. Результат затем преобразуется в двойной, чтобы он мог храниться во fraction . Самое простое решение:

 fraction = -1.0/9; 

Поскольку -1 и 9 являются целыми числами, то -1/9 является целым делением (с результатом 0 , который при двойном равен 0.0 ).

Чтобы сделать деление с плавающей запятой, вы должны преобразовать одно из чисел в двойное, (double) 9 , 9d или просто 9.0 .

В последнем случае fraction уже удваивается ( -1.0 ), поэтому fraction/9 является делением с плавающей запятой.

  • Быстрый метод для округления двойного до 32-битного int
  • Почему мы не можем использовать '==' для сравнения двух чисел с плавающей запятой или двойных чисел
  • Точность с плавающей запятой C ++
  • Почему добавление 0,1 несколько раз остается без потерь?
  • Как временные среды Java, нацеленные на процессоры pre-SSE2, реализуют базовые операции с плавающей запятой?
  • Каков самый быстрый способ конвертировать float в int на x86
  • Каков наиболее эффективный способ для плавающего и двойного сравнения?
  • Алгоритм преобразования двоичного кода IEEE 754 в строку?
  • сравнение значений float / double с использованием оператора ==
  • Почему целочисленное деление на -1 (отрицательное) приводит к FPE?
  • Двойной против BigDecimal?
  • Давайте будем гением компьютера.