“Warum?” – Weil die Sprache so gestaltet wurde. Wenn Sie möchten floatwirfst du zu a float Erste.
– Mystisch
25. April 2013 um 18:13 Uhr
Nur weil die linke Seite einer Zuweisung ein Float ist, bedeutet das nicht, dass die rechte Seite es sein muss – es bedeutet nur, dass die rechte Seite anbieten muss gleicher oder geringerer Genauigkeit dass ein Float, daher hat der Compiler keinen Grund, etwas anderes als int zu machen.
– Annäherung an DarknessFish
25. April 2013 um 18:14 Uhr
Da a und 350 sind ints.
– Daniel Fischer
25. April 2013 um 18:15 Uhr
Denn so haben es Kernighan und Ritchie definiert.
– Heiße Licks
25. April 2013 um 18:27 Uhr
@ValekHalfHeart “gleiche oder geringere Genauigkeit” hat nichts damit zu tun. int i = 2.0; und double d = 1; sind beide gültig, unabhängig von Ihrer Definition von „Präzision“.
– Pascal Cuoq
25. April 2013 um 18:34 Uhr
Sukrit Kalra
Dies liegt an der impliziten Konvertierung. Die Variablen b, c, d sind aus float Typ. Aber die / Der Operator sieht zwei ganze Zahlen, die er dividieren muss, und gibt daher eine ganze Zahl im Ergebnis zurück, die implizit in a konvertiert wird float durch das Hinzufügen eines Dezimalpunktes. Wenn Sie Gleitkomma-Divisionen wünschen, versuchen Sie, die beiden Operanden zu machen / schwimmt. Wie folgt.
#include <stdio.h>
int main() {
int a;
float b, c, d;
a = 750;
b = a / 350.0f;
c = 750;
d = c / 350;
printf("%.2f %.2f", b, d);
// output: 2.14 2.14
return 0;
}
int main() {
int a;
float b, c, d;
a = 750;
b = a / (float)350;
c = 750;
d = c / (float)350;
printf("%.2f %.2f", b, d);
// output: 2.14 2.14
}
Dies ist eine andere Möglichkeit, das zu lösen:
int main() {
int a;
float b, c, d;
a = 750;
b = a / 350.0; //if you use 'a / 350' here,
//then it is a division of integers,
//so the result will be an integer
c = 750;
d = c / 350;
printf("%.2f %.2f", b, d);
// output: 2.14 2.14
}
In beiden Fällen teilen Sie dem Compiler jedoch mit, dass 350 ein Gleitkommawert und keine Ganzzahl ist. Folglich ist das Ergebnis der Division ein Gleitkommawert und keine Ganzzahl.
Würde dies zum selben Ergebnis führen? b = (float) a / 350;
– Pilz
25. April 2013 um 18:16 Uhr
Ja es würde. Sie müssen einen in a umwandeln float.
– Sukrit Kalra
25. April 2013 um 18:18 Uhr
Eigentlich, 350.0 ist ein doubleund das Ergebnis der Operation wäre a double das wird dann umgewandelt float für den Auftrag. 350.0f wäre ein float.
– Daniel Fischer
25. April 2013 um 18:18 Uhr
@DanielFischer Danke für die Klarstellung. Was ist eigentlich der Unterschied zwischen einem Double und einem Float?
– Pilz
25. April 2013 um 18:21 Uhr
@jon Die Reichweite und Genauigkeit der Typen. Sie kann gleich sein, aber normalerweise a float ist ein 32-Bit-Typ mit 24 Bit Genauigkeit, die größte endliche Zahl, die gespeichert werden kann, ist 3,4028235e38, die kleinste positive Zahl 1,0e-45, während double ist ein 64-Bit-Typ mit 53 Bit Genauigkeit, der Zahlen bis zu 1,7976931348623157e308 und so klein wie 5,0e-324 speichern kann.
– Daniel Fischer
25. April 2013 um 18:27 Uhr
“a” ist eine ganze Zahl, wenn es durch eine ganze Zahl geteilt wird, gibt es eine ganze Zahl. Dann wird es “b” als Integer zugewiesen und wird zu einem Float.
Du solltest es so machen
b = a / 350.0;
Insbesondere rundet dies Ihr Ergebnis nicht, sondern schneidet in Richtung Null ab. Wenn Sie also -3/2 teilen, erhalten Sie -1 und nicht -2. Willkommen in der integralen Mathematik! Bevor CPUs Gleitkommaoperationen ausführen konnten oder mathematische Koprozessoren aufkamen, haben wir alles mit integraler Mathematik gemacht. Obwohl es Bibliotheken für Gleitkomma-Mathematik gab, waren sie (in CPU-Befehlen) für allgemeine Zwecke zu teuer, also verwendeten wir einen 16-Bit-Wert für den ganzen Teil einer Zahl und einen weiteren 16-Bit-Wert für den Bruch.
BEARBEITEN: Meine Antwort lässt mich an den klassischen alten Mann denken, der sagt: “Als ich in deinem Alter war …”
…
6 Wenn ganze Zahlen dividiert werden, ist das Ergebnis der / Operator ist der algebraische Quotient, wobei jeder Bruchteil verworfen wird.105) Wenn der Quotient a/b darstellbar ist, der Ausdruck (a/b)*b + a%b soll gleich sein a; ansonsten das Verhalten von beiden a/b und a%b ist undefiniert.
105) Dies wird oft als „Abschneiden in Richtung Null“ bezeichnet.
Die Division einer ganzen Zahl durch eine ganze Zahl ergibt ein ganzzahliges Ergebnis. 1/2 ergibt 0; Wenn Sie dieses Ergebnis einer Fließkommavariablen zuweisen, erhalten Sie 0,0. Um ein Gleitkommaergebnis zu erhalten, muss mindestens einer der Operanden ein Gleitkommatyp sein. b = a / 350.0f; sollte Ihnen das gewünschte Ergebnis liefern.
R.. GitHub HÖREN SIE AUF, ICE ZU HELFEN
Der wahrscheinlich beste Grund ist, weil 0xfffffffffffffff/15 würde dir eine schrecklich falsche antwort geben…
kyle_13
Die Division zweier ganzer Zahlen führt zu einem ganzzahligen Ergebnis.
Sie müssen eine Zahl als Gleitkommazahl umwandeln oder eine Dezimalzahl zu einer der Zahlen hinzufügen, z. B. a/350,0.
13896900cookie-checkWarum wird beim Teilen zweier Ganzzahlen kein Gleitkommawert ausgegeben? [duplicate]yes
“Warum?” – Weil die Sprache so gestaltet wurde. Wenn Sie möchten
float
wirfst du zu afloat
Erste.– Mystisch
25. April 2013 um 18:13 Uhr
Nur weil die linke Seite einer Zuweisung ein Float ist, bedeutet das nicht, dass die rechte Seite es sein muss – es bedeutet nur, dass die rechte Seite anbieten muss gleicher oder geringerer Genauigkeit dass ein Float, daher hat der Compiler keinen Grund, etwas anderes als int zu machen.
– Annäherung an DarknessFish
25. April 2013 um 18:14 Uhr
Da
a
und350
sindint
s.– Daniel Fischer
25. April 2013 um 18:15 Uhr
Denn so haben es Kernighan und Ritchie definiert.
– Heiße Licks
25. April 2013 um 18:27 Uhr
@ValekHalfHeart “gleiche oder geringere Genauigkeit” hat nichts damit zu tun.
int i = 2.0;
unddouble d = 1;
sind beide gültig, unabhängig von Ihrer Definition von „Präzision“.– Pascal Cuoq
25. April 2013 um 18:34 Uhr