/ / Comment puis-je obtenir tous les chiffres d'un double en Ruby? [fermé] - rubis, virgule flottante, double

Comment puis-je obtenir tous les chiffres d'un double dans Ruby? [fermé] - rubis, virgule flottante, double

Je veux manipuler un très long nombre en utilisant Ruby. Mais lorsque j'imprime le numéro à l'écran, je ne récupère que quelques chiffres du numéro d'origine. Alors, comment puis-je obtenir tous les chiffres que je veux?

Voici mon code

x = Array.new
y = Float(0)
for i in (0..100)
x[i] = 14*2**i
y += x[i]/100**i
end

puts y
#=> 14.2857142857143

Réponses:

2 pour la réponse № 1

Le résultat que vous obtenez est juste un représentation visuelle d'un nombre flottant. Cependant, en interne, les ordinateurs utilisent un format (virgule flottante binaire) qui ne peut pas représenter avec précision un nombre tel que 0,1, 0,2 ou 0,3.

Peu importe le code que nous pouvons vous fournir, mais si unnumber a une représentation infinie, chaque tentative de le formater ou de l’afficher sous forme décimale finira par se terminer par un tour. Ce peut être 10 chiffres, 1000 chiffres ou même 100000000 chiffres, mais c’est toujours un tour.

Il est difficile de composer avec les nombres décimaux. Selon votre objectif, vous souhaiterez peut-être:

  • envisager d'utiliser BigDecimal (BigDecimal fournit un support similaire pour les nombres très grands ou très précis) ou
  • en cas de manipulation d'argent. vous pouvez représenter les valeurs sous forme d'entiers et manipuler des entiers. Divisez le nombre entier par le nombre de centimes juste pour le formatage

Voici un exemple d'utilisation BigDecimal

require "bigdecimal"

x = []
y = BigDecimal(0)
for i in (0..100)
x[i] = 14*2**i
y += x[i]/100**i
end

puts y
# => 0.14E2

puts y.to_i
# => 14

puts y.to_f
# => 14.0

0 pour la réponse № 2

Voici ce que je ferais en exigeant la bibliothèque standard mathn :

require "mathn"

x = Array.new
y = Float(0)
for i in (0..100)
x[i] = 14*2**i
y += x[i]/100**i
end
y  # => 14.285714285714285
y.round(7) # => 14.2857143
y.round(9) # => 14.285714286
y.round(13) # => 14.2857142857143