Не округлять double до целого числа [дубликат]

339
11 февраля 2017, 06:49

На данный вопрос уже ответили:

  • Арифметическая операция 2 ответа

Есть программа с наследованием, состоящая из Main, Skelet, Podklass. Сама программа очень громоздкая, поэтому бросаю ее часть.

Есть 2 ученика. Выводится массив из их имен. Подключаем Scanner, вписываем любое из этих имен. По выбранному ученику выводятся обе его оценки и средний балл. Вот только средний балл возвращает округленное до целого числа значение. Как сделать округление хотя бы до десятых? Не могу понять, где ошибка, хоть рельс и много.

Скелет:

public class Skelet {
String im;
int ocenka1;
int ocenka2;
double SrBall;
public Skelet(String im, int ocenka1, int ocenka2, double srBall) {
    this.im = im;
    this.ocenka1 = ocenka1;
    this.ocenka2 = ocenka2;
    this.SrBall = srBall;
}
public String getIm() {
    return im;
}
public int getOcenka1() {
    return ocenka1;
}
public int getOcenka2() {
    return ocenka2;
}
public double getSrBall() {
    return SrBall = (ocenka1 + ocenka2)/2;
}
}

Подкласс:

public class Podklass extends Skelet {
    public Podklass(String im, int ocenka1, int ocenka2, double SrBall) {
        super(im, ocenka1, ocenka2, SrBall);
    }
}

Main:

import java.util.Scanner;
public class Main {
    public static void main (String[] args) {
        int i;
        double sb=0;
        Podklass uch1 = new Podklass("Дмитрий", 4,3, sb);
        Podklass uch2 = new Podklass("Максим", 5,4, sb);
        String[] mass = {uch1.getIm(), uch2.getIm()};
        for (i=0; i<mass.length; i++){
            System.out.println(mass[i]); // Выводим массив из имен
        }
        Scanner in = new Scanner(System.in);
        do {
        System.out.println("");
        System.out.println("Введите имя ученика: ");
        String name = in.nextLine();
        for (i = 0; i < mass.length; i++) {
            if (name.equals(mass[0])) {
                System.out.println(uch1.getIm() + " " + uch1.getOcenka1() + " " + uch1.getOcenka2() + " " + uch1.getSrBall());
                break;
            }
            if (name.equals(mass[1])) {
                System.out.println(uch2.getIm() + " " + uch2.getOcenka1() + " " + uch2.getOcenka2() + " " + uch2.getSrBall());
                break;
            }
            else {
                    break;
                }
            }
        }
        while (mass.length==2);
    }
}
Answer 1

В этом фрагменте кода:

(ocenka1 + ocenka2)/2

все операнды являются целочисленными, поэтому здесь происходит целочисленное деление. Результатом целочисленного деления является целое число.

Если в результате целочисленного деления получилось число с плавающей точкой, то происходит усечение (truncation) частного – дробная часть отбрасывается.

Решить проблему можно явным приведением типа, например, так:

(double) (ocenka1 + ocenka2)/2

или так:

(ocenka1 + ocenka2)/(double) 2

или так:

(ocenka1 + ocenka2)/2d

или таким образом:

(ocenka1 + ocenka2)/2.

Кстати, тип double здесь излишен, в этой ситуации вполне хватит float.

READ ALSO
/utils/add/message - не могу сделать RegExp

/utils/add/message - не могу сделать RegExp

Подскажите пожалуйста как составить regexp для такой строки /utils/add/message? таких /действие может быть сколько угодно

257
Проверка существования ключа в Map

Проверка существования ключа в Map

Необходимо в HashMap сохранить "ключ -> массив значений"

356
android:Взаимодействие Service и UI

android:Взаимодействие Service и UI

Подскажите наиболее простую, надежную и наиболее "синхронную" схему взаимодействия Компонента с GUI и ServiceВ ИНЕТЕ описано много схем, но, как...

308
Исполняемые файлы Java

Исполняемые файлы Java

Вопрос такой, если создатьjar или

373