J'écris une fonction dans laquelle j'ai besoin de lire une chaîne contient un nombre à virgule flottante et le ramener à Rational. Mais quand je fais toRational (read input :: Double)
, il ne tourne pas pour exemple: 0.9
en 9 % 10
comme prévu, mais 81% ..... 9007 ... Thxproblème avec le nombre double et rationnel
Répondre
Ce comportement est correct. Le numéro 0.9
n'est pas représentable comme Double
, pas dans Haskell, C ou Java. C'est parce que Double
et Float
utilisent la base 2: ils ne peuvent représenter qu'un certain sous-ensemble des fractions dyadiques exactement. Pour obtenir le comportement souhaité, importez le module Numeric
et utilisez la fonction readFloat
. L'interface est assez bancale (elle utilise le type ReadS
), vous devrez donc l'envelopper un peu. Voici comment vous pouvez l'utiliser:
import Numeric
myReadFloat :: String -> Rational -- type signature is necessary here
myReadFloat str =
case readFloat str of
((n, []):_) -> n
_ -> error "Invalid number"
Et le résultat:
> myReadFloat "0.9"
9 % 10
nombres à virgule flottante binaire ne peuvent pas représenter avec précision tous les numéros que la base -10 peut. Le nombre que vous voyez comme 0.9 n'est pas précisément 0.9 mais quelque chose de très proche. N'utilisez jamais de types à virgule flottante nécessitant une précision décimale - ils ne peuvent tout simplement pas le faire.
- 1. Calculatrice de nombre rationnel
- 2. tester si une décimale est suffisamment proche d'un nombre rationnel
- 3. Vérifie si un nombre est rationnel en Python
- 4. nombre et retirer vba d'accès en double
- 5. Sélénium ou testeur fonctionnel rationnel
- 6. php problème de débordement double
- 7. Stryts-JQuery Plugin Problème avec double Select
- 8. django double "étend", problème avec login
- 9. NSDate et double problème de précision
- 10. ASP.Net double-cliquez sur le problème
- 11. Fonctionnement avec générique et double
- 12. DOM innerHTML double problème
- 13. Comment rationnel peut aider dans le développement mainframe
- 14. C# - un problème très petit nombre - pas assez de chiffres dans le double type de données
- 15. wpfToolkit: DataGrid Double-cliquez sur le problème
- 16. Problème de double publication
- 17. Problème avec une fonction récursive pour trouver sqrt d'un nombre
- 18. C Double Gratuit Problème
- 19. Double de Total Problème
- 20. Presentmodalviewcontroller problème de méthode avec le nombre de retenue
- 21. double [,] type, comment obtenir le nombre de lignes?
- 22. struts2 double soumettre problème
- 23. javascript simple double citation problème
- 24. Problème avec le thread et l'initialisation
- 25. problème avec nombre aléatoire en C#
- 26. java double problème de tamponnage
- 27. problème avec le cas et le statut
- 28. Problème de nombre MySQL
- 29. Initialisation du tableau 2D avec nombre dynamique de lignes et nombre fixe de colonnes. C++
- 30. Double problème d'encodage d'URL php
est-il une version qui gère les nombres négatifs correctement? – Martijn
Si vous voulez gérer des nombres négatifs, utilisez "readSigned readFloat". – Martijn