Я пытался этот метод перегрузки кода, и я получил ошибку

не найдено подходящего метода для добавления (двойной, двойной)

Код:

class Adder {
    static float add(float a, float b) {
        return a + b;
    }

    static int add(int a, int b) {
        return a + b;
    }
}

class TestOverloading1 {
    public static void main(String[] args){
        System.out.println(Adder.add(11.5, 11.5));
        System.out.println(Adder.add(27, 21));
    }
}

При написании 11,5f в параметрах это работает хорошо.

Я понял разницу между float и double из здесь и здесь.

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

Я знаю, что он принимает двойную по умолчанию. Но я хочу знать, в чем причина этого?

6
Shachi 4 Сен 2017 в 12:12

5 ответов

Лучший ответ

Литерал с плавающей запятой без суффикса (например, 11.5) по определению имеет тип double (аналогично, целочисленный литерал без суффикса имеет тип int).

Параметр double недопустим для метода, который принимает аргументы float (поскольку приведение от double к float может привести к потере данных, и поэтому компилятор выиграл ' выполнить такое литье автоматически).

С другой стороны, 11.5f является литералом float, поэтому вы можете передавать такие литералы в ваш метод add(float a,float b).

7
Eran 4 Сен 2017 в 09:20

В Java, когда мы вводим десятичное число как 11,5, оно считается двойным. double является 64-битным, а float 32-битным, поэтому преобразование невозможно, поэтому возникает исключение времени компиляции. Для получения дополнительной информации посетите: примитивные типы данных

2
Mohit Tyagi 4 Сен 2017 в 09:25

Это просто спецификация. Точно так же, как int имеет значение по умолчанию 0 в Java.

Двойной тип по умолчанию для десятичных значений:

double: тип данных double - 64-битная IEEE 754 с двойной точностью плавающая запятая. Диапазон его значений выходит за рамки этого обсуждение, но указано в типах с плавающей точкой, форматах и Раздел Значений Спецификации языка Java. Для десятичных значений этот тип данных обычно используется по умолчанию . Как указано выше, этот тип данных никогда не должен использоваться для точных значений, таких как валюта.

Источник: https://docs.oracle.com/javase/tutorial/ Java / nutsandbolts / datatypes.html

0
Javdroider 4 Сен 2017 в 09:22

Дела

Adder.add(11.5,11.5)

Такой же как

double a = 11.5;
double b = 11.5;
Adder.add(a, b)

Который не соответствует параметрам в статическом методе

static float add(float a,float b){return a+b;}  

Так что вы должны: бросить эти литералы, чтобы плавать:

Adder.add(11.5f, 11.5f );

Или объявить a и b как float

float a = 11.5;
float b = 11.5;
Adder.add(a, b)
4
ΦXocę 웃 Пepeúpa ツ 4 Сен 2017 в 09:14

«11,5» без ничего считается двойным в Java. Вы можете использовать что-то как:

System.out.println(Adder.add(new Float(11.5),new Float(11.5)));
2
Stéphane Ammar 4 Сен 2017 в 09:15