Почему Java округляет мое двойное значение?

Я пытаюсь написать программу Java, которая находит сумму следующего ряда, используя вход для значения n:

формула

Код, который я написал, выглядит следующим образом:

package sum_of_series1;
import java.util.Scanner;

public class Sum_of_series1 
{
    public static void main(String[] args) 
    {
        Scanner sc = new Scanner (System.in);
        int n, i;
        double sum;
        sum = 1;
        System.out.println("Enter the value of n:");
        n = sc.nextInt();
        i = 0;
        while (i<n) 
        {
            i++;
            sum = sum + ((double)(i/(i+1)));
        }
        System.out.println("The sum of the series is " + sum);
    }
    
}

Однако вывод для каждого входа n выглядит следующим образом:

The sum of the series is 1.0

Ясно, что это неверно (например, n = 4). После некоторого осмотра я понял, что ((double)(i/(i+1))) каждый раз вычисляется как 0.0. Почему, например, 2/3 не вычисляется как 0.6666666666666666 и как решить эту проблему?

Однако странно, когда я пишу System.out.println((double) 2/3), выводится 0.6666666666666666. Я довольно новичок в программировании и очень запутался. Любая помощь приветствуется!


person learning123    schedule 22.05.2021    source источник
comment
i является целым числом, и деление на целое число дает целое число. Так что 1/2 это 0, например. Вам нужно преобразовать его в число с плавающей запятой или удвоить перед делением.   -  person Ted Klein Bergman    schedule 22.05.2021
comment
Ваше применение к double происходит после нанесения урона.   -  person Boris the Spider    schedule 22.05.2021


Ответы (2)


Это происходит потому, что вы делите на целые числа, а затем приводите значение к удвоению. Вы должны привести одно из целых чисел, прежде чем делить их друг на друга, например: ((double)i)/(i + 1). При делении с использованием целых чисел JVM всегда возвращает целое число, округляя значение в меньшую сторону, поэтому перед делением необходимо привести одно из них.

person Programmer    schedule 22.05.2021

Проблема здесь:

sum = sum + ((double)(i/(i+1)));

Вы бросаете только округленное целое число. Вы можете думать об этом так:

int a = i / (i + 1);
double b = (double) a; // = a.0

Просто переместите приведение к следующей скобке:

sum = sum + ( (double) i / (i+1) );
person Daniel    schedule 22.05.2021
comment
Вы имеете в виду int a = i / (i+1) . Из-за правил приоритета в грамматике (и общих почти для всех языков, кроме APL и Forth) (i / i + 1) совпадает с (i/i) + 1, который для ненулевого i совпадает с (1+1) или 2. - person dave_thompson_085; 22.05.2021