Maison > développement back-end > Tutoriel Python > Comment tronquer avec précision les valeurs flottantes sans arrondir ?

Comment tronquer avec précision les valeurs flottantes sans arrondir ?

DDD
Libérer: 2024-11-05 19:47:02
original
814 Les gens l'ont consulté

How to Precisely Truncate Float Values Without Rounding?

Comment obtenir des valeurs flottantes tronquées avec précision ?

Tronquer des valeurs flottantes, ou supprimer des chiffres au-delà d'un nombre spécifié de décimales, est une opération courante en programmation. Cependant, obtenir une troncature précise sans arrondi peut être difficile en raison des limites de la représentation à virgule flottante.

Comprendre le problème

Prenons l'exemple :

1.923328437452 -> 1.923
Copier après la connexion

Un naïf L'approche serait de convertir le flottant en chaîne et de le tronquer, mais cela peut conduire à des erreurs en raison de la nature imprécise des représentations à virgule flottante. Différentes valeurs à virgule flottante peuvent avoir la même représentation binaire, ce qui entraîne une troncature ambiguë.

La méthode recommandée

Pour les versions 2.7 et supérieures de Python, la fonction suivante fournit une troncature précise sans arrondi :

def truncate(f, n):
    '''Truncates/pads a float f to n decimal places without rounding'''
    s = '{}'.format(f)
    if 'e' in s or 'E' in s:
        return '{0:.{1}f}'.format(f, n)
    i, p, d = s.partition('.')
    return '.'.join([i, (d+'0'*n)[:n]])
Copier après la connexion

Explication

Le cœur de cette méthode est de convertir le float en chaîne en utilisant '{}'.format(f) et de tronquer la chaîne au nombre de décimales souhaité. Pour les valeurs en notation scientifique (« e » ou « E »), la syntaxe '{0:.{1}f}'.format(f, n) est utilisée pour spécifier la précision.

Gestion spéciale Cas

Dans de rares cas, les flottants très proches des nombres ronds peuvent encore être mal tronqués. Dans de tels cas, spécifiez une précision plus élevée pour garantir que l'arrondi lors de la conversion de chaîne n'affecte pas le résultat.

Alternatives pour les anciennes versions de Python

Pour les versions de Python inférieures à 2.7, une méthode moins précise consiste à arrondir le flottant à 12 décimales avant la troncature :

def truncate(f, n):
    '''Truncates/pads a float f to n decimal places without rounding'''
    s = '%.12f' % f
    i, p, d = s.partition('.')
    return '.'.join([i, (d+'0'*n)[:n]])
Copier après la connexion

Conclusion

Ce code fournit une solution robuste pour tronquer les valeurs flottantes sans arrondi, garantissant une troncature précise pour un large éventail d'entrées.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal