2009-04-24 4 views
21

В другом упражнении Брюса Эккеля код, который я написал, принимает метод и изменяет значение в другом классе. Вот мой код: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 s быть float s, а?

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

ответ

29

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

z.b = 2.2f 

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

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

+0

добавление «f» исправлено. благодаря! – phill

17

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

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

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

+9

«Поплавки могут быть удвоены, но двойники никогда не будут плавать». это неправильно. двойники могут быть плавающими, если они лежат в пределах диапазона поплавка. –

+0

Что делать, если я хотел хранить как '4.1' в' float', я не могу, потому что он не проходит диапазон '3.4xxx'? похоже, не понимают, почему верхняя граница начинается с '3.xxx', когда вы, очевидно, можете хранить' 999.99' никаких проблем. Я предполагаю, что чем больше десятичных точек вы добавляете, тем меньше вы можете использовать перед десятичной точкой? так почему же это '3.XX' не должно быть« 0.XX »как максимум? – SSpoke

+0

@SSpoke (я так и не получил уведомление об этом комментарии, поэтому я просто отвечаю на него сейчас). Эти диапазоны представляют собой научную нотацию ... это примерно 340,282,346,638,528,860,000,000,000,000,000,000,000,000.0 в десятичной форме для верхней границы поплавка. – Powerlord

9

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

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

Если вы пытаетесь сделать наоборот (то есть назначить float к double), что было бы хорошо, так как вы можете поместить float «s 32 бита в пределах double» s 64.

3
can't doubles be floats as well? 

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

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

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

6

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

+1

Я думаю, вы никогда не занимались разработкой OpenGL через Java ...: P – User

+1

@Manius Я сделал за последние 8 лет с тех пор, как написал это, но более мощный графический процессор означает, что нет большой разницы между использованием float или double для случаев использования, над которыми я работал. Основная проблема заключается в том, что загрузка данных на GPU достаточно быстро. –

+1

Согласовано. Просто немного подобрав немного (да, это OLD-ответ, который я вижу сейчас). :) Это действительно было бы неплохо, если бы мы могли просто полностью сбрасывать поплавки, но ... – User

0

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

 Смежные вопросы

  • Нет связанных вопросов^_^