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

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

DDD
DDDoriginal
2024-11-05 19:47:02746parcourir

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

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]])

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]])

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!

Déclaration:
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