Comment effectuer une division dans Go

88

J'essaye d'effectuer une division simple en Go.

fmt.Println(3/10)

Cela imprime 0 au lieu de 0,3. C'est un peu bizarre. Quelqu'un pourrait-il s'il vous plaît partager quelle est la raison derrière cela? Je souhaite effectuer différentes opérations arithmétiques dans Go.

Merci

Vrushank Doshi
la source

Réponses:

89

L'expression 3 / 10est une expression constante non typée. La spécification le dit à propos des expressions constantes

si les opérandes d'une opération binaire sont différents types de constantes non typées, l'opération et, pour les opérations non booléennes, le résultat utilisent le genre qui apparaît plus loin dans cette liste: entier, rune, virgule flottante, complexe.

Étant donné que 3et 10sont des constantes entières non typées, la valeur de l'expression est un entier non typé ( 0dans ce cas).

L'un des opérandes doit être une constante à virgule flottante pour que le résultat soit une constante à virgule flottante. Les expressions suivantes correspondent à la constante à virgule flottante non typée 0.3:

3.0 / 10.0
3.0 / 10
3 / 10.0

Il est également possible d'utiliser des constantes typées. Les expressions suivantes évaluent à la float64constante 0.3:

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

L'impression de l'une des expressions ci-dessus s'imprimera 0.3. Par exemple, fmt.Println(3.0 / 10)imprime 0.3.

Dessus de muffin
la source
je prends des entrées en supposant qu'il s'agit d'un pourcentage. Par exemple, si l'utilisateur donne 30, je dois effectuer 30/100 * somenumber. L'entrée sera toujours un entier. Comment effectuer la division dans ce scénario?
Vrushank Doshi
Convertissez les entiers en nombres à virgule flottante.
Muffin Top
j'ai essayé fmt.Println (float64 (3/10)) mais ça me donne 0
Vrushank Doshi
7
@VrushankDoshi: fmt.Println(float64(3) / float64(10))donne 0.3.
peterSO
21

Comme mentionné par @Cerise et selon les spécifications

Les opérateurs arithmétiques s'appliquent aux valeurs numériques et donnent un résultat du même type que le premier opérande.

Dans ce cas, seul le premier opérande doit être une virgule flottante.

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

Exemple

robstarbuck
la source
Oui! juste le premier opérande
SMMousavi