чому f ставиться після плаваючих значень?


79

Я не знаю, чому f або F ставиться після значень з плаваючою комою в Java чи інших мовах? наприклад,

float fVariable = 12.3f;

будь-які функції, крім вказівки, що це плаваюче значення?



Оскільки в іншому випадку вони не є плаваючими значеннями, це ints або подвійні.
user207421

@DeepakRaghuwanshi Більше ніж трохи нескромно описувати власний блог як "найкраще пояснення цьому". Той факт, що насправді це вантаж сміття, не покращує ситуації.
user207421

Відповіді:


67

за замовчуванням 12.3- doubleбуквальний, тому сказати компілятору, щоб він поводився з ним floatявно -> він використовує fабоF


2
Так само кожен цілий літерал за замовчуванням є int. Отже, коли ми призначаємо літерал таким чином: long x = 2147483648; (це 2 ^ 31> int діапазон, але компілятор все ще вважає це літералом int. тому нам потрібно сказати компілятору, що це довге додавання L або l) long x = 2147483648L;
Navdeep Singh

Можливо, я спізнився на цю публікацію, але як так, що Java не може перетворити її на неявне плавання? Ми сказали, що тип float, то чому б він поводився з ним як із типовим подвійним, коли ми просто сказали йому, що це таке.
Стефан

52

Вбачаючи, що у вашій програмі існує лише стільки способів представити число, дизайнерам Java довелося вибирати і призначати кожну форму найпоширенішому випадку використання. Для тих форм, які вибрані за замовчуванням, суфікс, що позначає точний тип, необов’язковий.

  • Для літералів Integer (int, long) за замовчуванням використовується int . Зі зрозумілих причин.
  • Для літералів із плаваючою комою (з плаваючою, подвійною) значення за замовчуванням - double . Оскільки використання подвійного потенційно дозволяє безпечнішу арифметику щодо збережених значень.

Отже, коли ви вводите 12свою програму, це int літерал, на відміну від 12L, який є довгим . І коли ви вводите 12.3, це подвійний літерал, на відміну від 12.3F, який є флоат .

То де це актуально? В першу чергу при обробці знижених даних або звуженні конверсій. Кожного разу, коли ви знижуєте long до int або double до float, існує можливість втрати даних. Отже, компілятор змусить вас вказати, що ви дійсно хочете виконати перетворення звуження, сигналізуючи про помилку компіляції приблизно для цього:

float f = 12.3;

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

float f = 12.3f;

Отже, резюмуємо, необхідність вказувати суфікс для longs і floats - це компроміс, який вибрали дизайнери мови, щоб збалансувати необхідність уточнення, що саме таке число, та гнучкість перетворення чисел з одного типу сховища на інший.


1
Варто зазначити, що якщо dнайкраще doubleпредставляти якусь числову величину x, воно float f=(float)dбуде найближчим floatдо деякого значення, яке знаходиться в межах частки на трильйон x, хоча для цього потрібна типова діаграма. На відміну від цього, якщо fнайкраще floatподання якогось числового значення x, double d=fне потребує типової діаграми, навіть якщо воно часто не наближається до найкращого doubleподання xі може бути відключене на сотні порядків . Я вважаю іронічним, що float f=(float)(1.0/10.0)потрібен акторський склад, але double d=1.0f/10.0fцього не потрібно.
supercat

«Таким чином, компілятор змусить вас вказати , що ви дійсно хочете , щоб виконати перетворення звужується, сигналізуючи помилку компіляції що - щось на зразок цього:" Якщо це також поширюється на довго , хоча
RetroCode

@Perception, чому ти пишеш З цілком зрозумілої причини в першому пункті ти можеш, будь ласка, це детально описати?
Rishabh Agrawal

28

floatі doubleможе надати лише приблизні значення подання для деяких значень. наприклад 12,3 або 0,1

Різниця полягає в тому, що поплавок не такий точний (оскільки він має меншу точність, оскільки менший)

напр

System.out.println("0.1f == 0.1 is " + (0.1f == 0.1));
System.out.println("0.1f is actually " + new BigDecimal(0.1f));
System.out.println("0.1 is actually " + new BigDecimal(0.1));

відбитки

0.1f == 0.1 is false
0.1f is actually 0.100000001490116119384765625
0.1 is actually 0.1000000000000000055511151231257827021181583404541015625

Так само 0.1є найближче представництво в doubleі 0.1fє найближчим представництвом уfloat


Чудово! але який з них є фактичним (математичним) 0,1, а який рівним String.valueOf ("0,1")?
Seshu Vinay

4
Тільки BigDecimal точно дорівнює. Решта при правильному використанні дасть правильну відповідь при перетворенні у рядок.
Пітер Лорі

6

float fVariable = 12,3; добре. але коли ви використовуєте лише плаваюче значення (без будь-якого ідентифікатора) у будь-якому виразі, тоді вам потрібно сказати компілятору, що значення є плаваючим, тому ми використовуємо суфікс "f" після значення. приклад

float fl = 13f / 5f;

тут 13 і 5 - плаваючі значення.


float fVariable = 12,3; неправильно. Вам завжди потрібно додати префікс f для присвоєння поплавця. за замовчуванням кожне дійсне число подвійне.
Navdeep Singh

2

Під час компіляції всі числа з плаваючою комою (числа з десятковою комою) за замовчуванням подвоюються.

Отже, якщо ви не хочете, щоб ваше число подвоювалось і просто хочете, щоб воно було плаваючим, вам слід явно сказати компілятору, додавши f або F в кінці буквальної константи.


2

У Java ми маємо багато різних типів базових змінних, тому, щоб зробити це загальним, він має деякі функції за замовчуванням. Як, якщо ми вводимо вхід 16.02, він автоматично приймає його як подвійний вхід. Отже, якщо ви хочете вказати його як плаваючий, ми згадуємо після цифри 'f' або ми можемо просто використовувати:

float f = (float) 16.02;

або

float f = 16.02f;

Таким же чином ми повинні згадати 16 л, якщо ми хочемо, щоб номер зберігався як довгий тип, інакше він автоматично вибере тип за замовчуванням, тобто тип int.


1

Float - це 32-розрядна плаваюча крапка IEEE 754 з однією точністю, а Double - 64-бітна плаваюча точка IEEE 754 з подвійною точністю. Коли ви використовуєте значення з десятковою комою, а якщо не вказали значення 0,23f (зокрема, плаваюче), Java ідентифікує його як подвійне.

Для десяткових значень подвійний тип даних, як правило, вибір за замовчуванням, прийнятий Java. Перевір це


1

Якщо ви не використовуєте f, він буде інтерпретований як подвійний, що є типовим для Java. Ви також можете написати це так ##

float f=(float) 32.5956; float f=32.5956f;


Добре, щоб ви були в stackoverflow. Ваша відповідь гарна, проте інші колеги вже надали ту ж інформацію. Внесок справді цінується, якщо про нього не згадувалося раніше. Ласкаво просимо на борт ..
Hasnaa Ibraheem
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.