Вопрос

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

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тоже?

заранее спасибо

Это было полезно?

Решение

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

z.b = 2.2f

Буква «f» в конце числа делает его плавающим, а не двойным.

Java не будет автоматически сужать значение double до числа с плавающей запятой.

Другие советы

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

диапазон плавающего значения 1.40129846432481707e-45 к 3.40282346638528860e+38

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

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

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

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

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

can't doubles be floats as well?

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

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top