Pour arrondir au 0,05 le plus proche, je le divise par 0,05 et multiplie par 0,05. Comme décrit dans d'autres questions similaires.Boîtier étrange tout en arrondissant au 0,05 le plus proche - cas particulier
In [119]: (127.651//0.05)*0.05
Out[119]: 127.65
In [120]: (127.6501//0.05)*0.05
Out[120]: 127.65
In [121]: (127.65000001//0.05)*0.05
Out[121]: 127.65
In [122]: (127.65000000001//0.05)*0.05
Out[122]: 127.65
In [123]: (127.6500000000001//0.05)*0.05
Out[123]: 127.65
Jusqu'à ce que ce soit fait comme prévu. Toutefois, pour ce cas particulier:
In [124]: (127.650000000000000001//0.05)*0.05
Out[124]: 127.60000000000001
Je me serais attendu 127,65 ici. Essayé d'arrondir avant de diviser, mais encore une fois .. étrange. Non seulement j'obtiens un résultat inattendu (attendu 127.65), mais il donne également des résultats qui dépassent 2 décimales, ce qui entraînera une défaillance dans mes fonctions de traitement ultérieures.
In [125]: (round(127.650000000000000001,5)//0.05)*0.05
Out[125]: 127.60000000000001
Si j'exécute seulement la ronde intérieure, o/p est 127,65 ...
In [126]: round(127.650000000000000001,5)
Out[126]: 127.65
Mais sur l'ajout de la division et de multiplication logique .. le résultat devient inattendu.
In [125]: (round(127.650000000000000001,5)//0.05)*0.05
Out[125]: 127.60000000000001
Devrait-il y avoir un problème de type de données? ou limitations internes de précision de python?
Comment puis-je le surmonter d'une manière élégante?
PS:
1) J'utilise Python 2.7
2) Je suis finalement l'utiliser dans une fonction. Ce qui donne des résultats inattendus pour ce cas particulier. Je ne peux pas contrôler la qualité des données d'entrée et la précision de ses données, car cela provient de la lecture d'un fichier csv dans une trame de données.
def RP(price):# Round down to the nearest price quotable ...i.e. multiple of 0.05
return(round(price//0.05*0.05,2))
Plus classique [Les nombres à virgule flottante sont-ils brisés?] (Https://stackoverflow.com/q/588004/3001761). Si vous voulez une représentation exacte, pensez à utiliser ['Decimal'] (https://docs.python.org/3/library/decimal.html). – jonrsharpe
Je suis très nouveau à py, mais je suppose que pour les points flottants, il y aura des problèmes. l'importation de décimales le rendra plus précis, je suppose. Juste 'importer décimal' – ihpar
Indice: que vous donne 127,6500000000000056 == 127,65'? Est-ce que la réponse vous surprend? –