2013-03-11 5 views
5

J'essaie d'obtenir 2,4/0,8 == 3 GoGo division nombre flottant

w:=float64(2.4) 
fmt.Println(math.Floor(w/0.8),math.Floor(2.4/0.8)) 

Il me donne "2 3".

La question est pourquoi math.Floor(w/0.8) ne me donnera pas 3. Est-ce la limite de précision du nombre de flotteur?

+0

bien, je dois pousser à me donner 3, donc je fait: 'const NUDGE = 1E-10' et' Math.floor (w/0,8 + NUDGE) ' –

Répondre

9

La sortie du programme est correcte. La représentation de nombreux nombres réels au format IEEE n'est pas précise. Le premier nombre est en fait (dans la version limitée à 64 bits) inférieur à 3, donc floor renvoie correctement '2'. Le second est calculé au moment de la compilation en utilisant une plus grande précision.

Recommandé reading.

7

Oui, c'est la limite de précision. float64 est assez précis, mais 2.4 ne peut pas être stocké exactement en binaire. Lorsque les deux nombres sont constants, le calcul est effectué avec une plus grande précision au moment de la compilation, et lorsque le résultat est arrondi à float64, il sort exactement à 3. Mais quand l'un des nombres est une variable, le calcul doit être fait à l'exécution, et il sort à 2.9999999999999996, qui étage tronque à 2.

0

Bien que cela ne répond pas à la question (pourquoi) J'ai trouvé cette page à la recherche d'une fonction ronde si juste que quelqu'un le trouve utile voici ma propre solution:

func Round(val float64) (float64) { 
     if float64(int(val)) < val { 
      return float64(int(val) + 1) 
     } 
     return val 
    } 
+1

Ce n'est pas une fonction ronde. Ce n'est même pas une fonction de plafond correcte. Utilisez la bibliothèque de maths. – JimB

+0

c'était une fonction de plafond correcte pour mon cas. Je devais arrondir x.x à x + 1 donc voici la fonction. La bibliothèque de maths n'a pas fourni une telle fonction. Je l'ai déjà vérifié. – hey

+0

Ensuite, ne l'appelez pas Round si c'est une fonction Plafond. cela ne gère pas les négatifs, Inf ou NaN. aussi [math.Ceil] (http://golang.org/pkg/math/#Ceil). – JimB

Questions connexes