Warum wird f nach Gleitkommawerten gesetzt?


78

Ich weiß nicht, warum f oder F nach Float-Werten in Java oder anderen Sprachen steht. zum Beispiel,

float fVariable = 12.3f;

Gibt es andere Funktionen als die Angabe, dass dies ein Float-Wert ist?



Da es sich sonst nicht um Float-Werte handelt, handelt es sich um Ints oder Doubles.
Marquis von Lorne

@DeepakRaghuwanshi Es ist mehr als unbescheiden, Ihren eigenen Blog als "die beste Erklärung dafür" zu beschreiben. Die Tatsache, dass es sich tatsächlich um eine Menge Müll handelt, verbessert die Sache nicht.
Marquis von Lorne

Antworten:


66

Standardmäßig 12.3ist es doublewörtlich. Um den Compiler anzuweisen, es floatexplizit zu behandeln -> verwendet es foderF


2
Ebenso ist jedes ganze Literal standardmäßig int. Wenn wir also ein Literal folgendermaßen zuweisen: long x = 2147483648; (Dies ist der Bereich 2 ^ 31> int, aber der Compiler betrachtet dies immer noch als int-Literal. Daher müssen wir dem Compiler durch Hinzufügen von L oder l mitteilen, dass dies lang ist.) long x = 2147483648L;
Navdeep Singh

Ich komme vielleicht zu spät zu diesem Beitrag, aber warum kann Java ihn nicht implizit in Float konvertieren? Wir sagten, der Typ sei float. Warum sollte er dann als Standard-Double behandelt werden, wenn wir ihm nur sagten, was er ist?
Markus

50

Da es nur so viele Möglichkeiten gibt, eine Zahl in Ihrem Programm darzustellen, mussten die Designer von Java jedes Formular auswählen und dem häufigsten Anwendungsfall zuordnen. Für die standardmäßig ausgewählten Formulare ist das Suffix , das den genauen Typ angibt, optional.

  • Für ganzzahlige Literale (int, long) ist der Standardwert int . Aus offensichtlichen Gründen.
  • Für Gleitkomma-Literale (float, double) ist der Standardwert double . Weil die Verwendung von double möglicherweise eine sicherere Arithmetik für die gespeicherten Werte ermöglicht.

Wenn Sie also 12Ihr Programm eingeben, ist dies ein int- Literal im Gegensatz zu 12Leinem langen . Und wenn Sie tippen 12.3, ist das ein doppeltes Literal im Gegensatz zu 12.3Feinem Float .

Wo ist das also relevant? Hauptsächlich beim Umgang mit Downcasts oder beim Eingrenzen von Conversions. Immer wenn Sie einen Long auf einen Int oder einen Double auf einen Float herabstufen, besteht die Möglichkeit eines Datenverlusts. Der Compiler zwingt Sie also anzugeben, dass Sie die Verengungskonvertierung wirklich durchführen möchten, indem er einen Kompilierungsfehler für Folgendes signalisiert:

float f = 12.3;

Da 12.3 ein Double darstellt, müssen Sie es explizit in einen Float umwandeln (im Grunde genommen bei der Verengungskonvertierung abmelden). Andernfalls können Sie mithilfe des richtigen Suffix angeben, dass die Zahl tatsächlich ein Float ist.

float f = 12.3f;

Zusammenfassend lässt sich sagen, dass die Angabe eines Suffixes für Longs und Floats ein Kompromiss ist, den die Sprachdesigner gewählt haben, um die Notwendigkeit, genau anzugeben, was eine Zahl ist, mit der Flexibilität, Zahlen von einem Speichertyp in einen anderen zu konvertieren, auszugleichen.


1
Es ist erwähnenswert, dass wenn ddie beste doubleDarstellung einer numerischen Größe ist x, sie einem Wert float f=(float)dam nächsten kommt float, der innerhalb eines Teils pro Billion von liegt x, obwohl eine Typumwandlung erforderlich ist. Wenn dagegen fdie beste floatDarstellung eines numerischen Werts vorliegt x, double d=fist keine Typumwandlung erforderlich, obwohl diese häufig nicht annähernd der besten doubleDarstellung entspricht xund um Hunderte von Größenordnungen abweicht . Ich finde es ironisch, dass float f=(float)(1.0/10.0)eine Besetzung nötig ist, aber double d=1.0f/10.0fnicht.
Supercat

"Der Compiler wird Sie also zwingen anzugeben, dass Sie die Verengungskonvertierung wirklich durchführen möchten, indem er einen Kompilierungsfehler für so etwas signalisiert:" Sollte das auch für lange gelten
RetroCode

@Perception warum schreibst du Aus offensichtlichen Gründen im ersten Punkt kannst du es bitte näher erläutern?
Rishabh Agrawal

27

floatund doublekann nur ungefähre Darstellungswerte für einige Werte bereitstellen. zB 12,3 oder 0,1

Der Unterschied besteht darin, dass der Schwimmer nicht so genau ist (da er weniger präzise ist, weil er kleiner ist).

z.B

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));

druckt

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

So 0.1ist die nächste Darstellung in doubleund 0.1fist die nächste Darstellung infloat


Toll! aber welches ist tatsächlich (mathematisch) 0.1 und welches ist gleich String.valueOf ("0.1")?
Seshu Vinay

4
Nur das BigDecimal ist genau gleich. Der Rest gibt die richtige Antwort, wenn er bei korrekter Verwendung in einen String konvertiert wird.
Peter Lawrey

5

float fVariable = 12,3; ist gut. Wenn Sie jedoch zu diesem Zeitpunkt nur den Float-Wert (ohne Bezeichner) in einem Ausdruck verwenden, müssen Sie dem Compiler mitteilen, dass der Wert float ist. Daher verwenden wir das Suffix "f" nach dem Wert. Beispiel

float fl = 13f / 5f;

hier sind 13 und 5 Gleitkommawerte.


float fVariable = 12,3; das ist nicht richtig. Sie müssen immer das Präfix f für die Float-Zuweisung hinzufügen. Standardmäßig ist jede reelle Zahl doppelt.
Navdeep Singh

1

Während der Kompilierung werden alle Gleitkommazahlen (Zahlen mit Dezimalpunkt) standardmäßig verdoppelt.

Wenn Sie also nicht möchten, dass sich Ihre Zahl verdoppelt und nur als float, möchten Sie dem Compiler dies explizit mitteilen, indem Sie am Ende der Literalkonstante ein f oder F hinzufügen .


1

In Java gibt es viele verschiedene grundlegende Variablentypen. Um es allgemein zu halten, verfügt es über einige Standardfunktionen. Wenn wir eine Eingabe 16.02 geben, wird diese automatisch als doppelte Eingabe verwendet. Wenn Sie es also als float angeben möchten, erwähnen wir das 'f' nach der Zahl oder wir können einfach verwenden:

float f = (float) 16.02;

oder

float f = 16.02f;

Ebenso müssen wir 16 l erwähnen, wenn die Nummer als langer Typ gespeichert werden soll, sonst wird automatisch der Standardtyp ausgewählt, dh der Int-Typ.


0

Float ist ein 32-Bit-IEEE 754-Gleitkomma mit einfacher Genauigkeit und Double ist ein 64-Bit-IEEE 754-Gleitkomma mit doppelter Genauigkeit. Wenn Sie einen Wert mit Dezimalstellen verwenden und diesen nicht als 0,23f (speziell float) angeben, identifiziert Java ihn als Double.

Bei Dezimalwerten ist der doppelte Datentyp im Allgemeinen die Standardauswahl von Java. Überprüfen Sie dies


0

Wenn Sie f nicht verwenden, wird es als double interpretiert, was in Java die Standardeinstellung ist. Sie können es auch so schreiben ##

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


Es ist gut, Sie im Stackoverflow zu haben. Ihre Antwort ist in Ordnung, aber andere Kollegen haben bereits die gleichen Informationen gegeben. Ein Beitrag wird wirklich geschätzt, wenn er vorher nicht erwähnt wurde. Willkommen an Bord ..
Hasnaa Ibraheem
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.