So führen Sie eine Teilung in Go durch

89

Ich versuche eine einfache Unterteilung in Go durchzuführen.

fmt.Println(3/10)

Dies gibt 0 statt 0,3 aus. Das ist irgendwie komisch. Könnte jemand bitte mitteilen, was der Grund dafür ist? Ich möchte verschiedene arithmetische Operationen in Go ausführen.

Vielen Dank

Vrushank Doshi
quelle

Antworten:

92

Der Ausdruck 3 / 10ist ein untypisierter konstanter Ausdruck. Die Spezifikation sagt dies über konstante Ausdrücke aus

Wenn die Operanden einer binären Operation verschiedene Arten von untypisierten Konstanten sind, verwenden die Operation und für nicht-boolesche Operationen das Ergebnis die Art, die später in dieser Liste angezeigt wird: Ganzzahl, Rune, Gleitkomma, Komplex.

Da 3und 10untypisierte Ganzzahlkonstanten sind, ist der Wert des Ausdrucks eine untypisierte Ganzzahl ( 0in diesem Fall).

Einer der Operanden muss eine Gleitkommakonstante sein, damit das Ergebnis zu einer Gleitkommakonstante wird. Die folgenden Ausdrücke ergeben die untypisierte Gleitkommakonstante 0.3:

3.0 / 10.0
3.0 / 10
3 / 10.0

Es ist auch möglich, typisierte Konstanten zu verwenden. Die folgenden Ausdrücke werden als float64Konstante ausgewertet 0.3:

float64(3) / float64(10)
float64(3) / 10
3 / float64(10)

Wenn Sie einen der oben genannten Ausdrücke drucken, wird gedruckt 0.3. Zum Beispiel fmt.Println(3.0 / 10)druckt 0.3.

Cerise Limón
quelle
Ich nehme Input unter der Annahme, dass es Prozentsatz ist. Zum Beispiel, wenn der Benutzer 30 gibt, muss ich 30/100 * somenumber ausführen. Die Eingabe ist immer eine Ganzzahl. Wie wird in diesem Szenario eine Teilung durchgeführt?
Vrushank Doshi
Konvertieren Sie die Ganzzahlen in Gleitkommazahlen.
Cerise Limón
Ich habe versucht, fmt.Println (float64 (3/10)), aber es gibt mir 0
Vrushank Doshi
7
@VrushankDoshi: fmt.Println(float64(3) / float64(10))gibt 0.3.
PeterSO
22

Wie von @Cerise und gemäß Spezifikation erwähnt

Arithmetische Operatoren gelten für numerische Werte und ergeben ein Ergebnis des gleichen Typs wie der erste Operand.

In diesem Fall muss nur der erste Operand ein Gleitkomma sein.

fmt.Println(3.0/10)
fmt.Println(float64(3)/10)
// 0.3 0.3

Beispiel

Robstarbuck
quelle
Ja! gerade erster Operand
SMMousavi