Подтвердить что ты не робот

Java: double vs float

В другом упражнении Брюса Эккеля код, который я написал, принимает метод и изменяет значение в другом классе. Вот мой код:

class Big {
  float b;
}

public class PassObject {
  static void f(Letter y) {
    y.c = 'z';
  } //end f()
  static void g(Big z) {
    z.b = 2.2;
  }

  public static void main(String[] args ) {
    Big t = new Big();
    t.b = 5.6;
    System.out.println("1: t.b : " + t.b);
    g(x);
    System.out.println("2: t.b: " + t.b);
  } //end main
}//end class

Он бросает ошибку, говоря "Возможная потеря точности".

PassObject.java:13: possible loss of precision
found: double
required : float   z.b = 2.2
passobject.java:20: possible loss of precision
found : double
required : float   t.b = 5.6

Не может double быть float?

заблаговременно

4b9b3361

Ответ 1

Да, но вы должны указать, что они являются плавающими, в противном случае они рассматриваются как двойные:

z.b = 2.2f

"f" в конце номера делает его плавающим, а не двойным.

Java не будет автоматически сужать double до float.

Ответ 2

Нет, поплавки могут автоматически повышаться до удвоения, но удваивать никогда нельзя будет плавать без явного литья, потому что удваивает больше диапазона.

диапазон плавания 1.40129846432481707e-45 - 3.40282346638528860e+38

двойной диапазон 4.94065645841246544e-324d - 1.79769313486231570e+308d

Ответ 3

По умолчанию Java будет обрабатывать десятичное число (например, "4.3" ) как double, если вы не указали иначе float, добавив f после номера (например, "4.3f" ).

У вас такая же проблема на обеих линиях. Во-первых, десятичный литерал интерпретируется как компилятор как двойной. Затем он пытается присвоить его b, который имеет тип float. Поскольку a double - 64 бита, а float - всего 32 бита (см. документация по Java-примитивам), Java дает вам сообщение об ошибке float не может помещаться внутри double. Решение состоит в том, чтобы добавить f в ваши десятичные литералы.

Если вы пытались сделать обратное (т.е. назначьте float a double), это будет нормально, так как вы можете поместить float 32 бита в double 64.

Ответ 4

Не используйте float. Практически никогда не было веских оснований для его использования и не было более десятилетия. Просто используйте double.

Ответ 5

can't doubles be floats as well?

Нет. Каждое значение или переменная имеет только один тип (double, float, int, long и т.д.). Java Language Specification точно определяет, что происходит, когда вы пытаетесь присвоить значение одного типа переменной другого типа. Как правило, присвоения "меньшего" значения "более крупному" типу разрешены и выполняются неявно, но присваивания, в которых информация может быть потеряна, потому что целевой тип слишком "мал" для хранения всех значений типа начала, не допускается компилятор, даже если конкретное значение вписывается в целевой тип.

Вот почему компилятор жалуется, что присвоение двойного значения (которое буквально неявно) переменной float может потерять информацию, и вы должны успокоить ее, либо сделав значение float, либо явно нажав.

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

Ответ 6

диапазон float ниже, чем двойной, поэтому float может быть легко представлен в double, но обратное невозможно, потому что, допустим, мы берем значение, которое выходит из диапазона float, тогда во время соглашения мы потеряем точные данные