J'ai une valeur numérique comme 30.6355 qui représente l'argent, comment arrondir à 2 décimales?J'ai une valeur numérique comme 30.6355 qui représente l'argent, comment arrondir à 2 décimales?
Répondre
Ruby 1.8:
class Numeric
def round_to(places)
power = 10.0**places
(self * power).round/power
end
end
(30.6355).round_to(2)
Ruby 1.9:
(30.6355).round(2)
En 1.9, round peut arrondir à un nombre spécifié de chiffres.
Vous ne devriez pas utiliser double
ou float
types lorsqu'ils traitent avec la devise: ils ont à la fois trop de décimales et des erreurs d'arrondi occasionnelles. L'argent peut tomber à travers ces trous et il sera difficile de repérer les erreurs après que cela se produise.
Lorsque vous gérez de l'argent, utilisez un type décimal fixe. En Ruby (et Java), utilisez BigDecimal.
En fait, le plus gros problème est qu'elles n'ont pas de décimales * du tout *, elles ont * des positions * binaires *. –
@ Jörg, a raison. Voir http://en.wikipedia.org/wiki/Floating_point#Accuracy_problems pour une explication. – lucasrizoli
'gem install money'. http://money.rubyforge.org/ –
Ceci arrondira pour quelques cas utiles - pas bien écrit mais cela fonctionne! N'hésitez pas à modifier.
def round(numberString)
numberString = numberString.to_s
decimalLocation = numberString.index(".")
numbersAfterDecimal = numberString.slice(decimalLocation+1,numberString.length-1)
numbersBeforeAndIncludingDeciaml = numberString.slice(0,decimalLocation+1)
if numbersAfterDecimal.length <= 2
return numberString.to_f
end
thingArray = numberString.split("")
thingArray.pop
prior = numbersAfterDecimal[-1].to_i
idx = numbersAfterDecimal.length-2
thingArray.reverse_each do |numStr|
if prior >= 5
numbersAfterDecimal[idx] = (numStr.to_i + 1).to_s unless (idx == 1 && numStr.to_i == 9)
prior = (numStr.to_i + 1)
else
prior = numStr.to_i
end
break if (idx == 1)
idx -= 1
end
resp = numbersBeforeAndIncludingDeciaml + numbersAfterDecimal[0..1]
resp.to_f
end
round(18.00) == 18.0
round(18.99) == 18.99
round(17.9555555555) == 17.96
round(17.944444444445) == 17.95
round(15.545) == 15.55
round(15.55) == 15.55
round(15.555) == 15.56
round(1.18) == 1.18
round(1.189) == 1.19
- 1. Comment arrondir nombre à 2 décimales
- 2. Comment arrondir une décimale à 2 décimales dans .Net?
- 3. Est-ce qu'un Type représente une valeur numérique C#
- 4. arrondir les décimales dans Django
- 5. Comment tronquer les décimales sans arrondir?
- 6. Comment puis-je arrondir la valeur jusqu'à 2 décimales en PHP
- 7. Arrondir les valeurs décimales en C#
- 8. Comment arrondir une valeur double à un nombre sélectionné de décimales dans .NET?
- 9. Comment formater une double valeur jusqu'à 2 décimales dans l'iPhone
- 10. ronde à 2 décimales
- 11. Comment faire pour arrondir les valeurs décimales dans l'objectif C
- 12. T-SQL Arrondir aux positions décimales
- 13. arrondir des valeurs décimales jusqu'à 0,01?
- 14. Comment abaisser db.GeoPtProperty précision à 2 décimales
- 15. Comment arrondir toujours les valeurs décimales à la valeur entière la plus proche?
- 16. Impression de la valeur d'un flottant à 2 décimales
- 17. Comment arrondir et formater une décimale correctement?
- 18. représente 2 échantillons sint16s comme un seul échantillon uint32
- 19. limite jQuery 2 décimales
- 20. Arrondir une valeur dans la liaison WPF
- 21. comment arrondir une valeur double à 0,05 en java
- 22. Comment calculer une valeur à un certain nombre de décimales?
- 23. Comment arrondir un flotteur?
- 24. Comment initialiser une carte qui prend une structure comme valeur?
- 25. XmlSlurper NodeChild qui représente une balise body?
- 26. Comment affecter une valeur numérique à chaque lettre majuscule?
- 27. Comment obtenir une variable pour avoir 2 décimales
- 28. Regex qui correspond numeric avec jusqu'à 2 décimales
- 29. Je dois arrondir une valeur dans vb.net
- 30. Créer une instance qui représente la moyenne de plusieurs instances
Êtes-vous vendant de l'essence? Pourquoi auriez-vous de l'argent à la 5ème virgule? –
duplicata possible de [Arrondir un nombre entier de rubis à 0,05 près] (http://stackoverflow.com/questions/1346257/round-a-ruby-integer-up-to-the-nearest-0-05) - question dit 0.05 mais la même technique s'applique à n'importe quelle unité, comme 0.01 –
Oh, l'argent dans le flotteur ... encore ... Est-ce que '.0055' est une erreur flottante accumulée?))) – Nakilon