Maison >développement back-end >Tutoriel Python >Avez-vous appris les deux méthodes d'arrondi en Python ?

Avez-vous appris les deux méthodes d'arrondi en Python ?

PHPz
PHPzavant
2023-05-02 13:25:063591parcourir

1. Utiliser le rond

Dans la plupart des cas, nous utiliserons le rond pour conserver les décimales, mais cela n'est pas conforme aux règles de nos connaissances mathématiques.

round(number[, ndigits])

round() arrondit le nombre (généralement un nombre à virgule flottante) selon les règles suivantes (Python3) :

Parlons du cas où ndigits n'est pas 0 :

Si le dernier chiffre du chiffre réservé est inférieur supérieur ou égal à 4, si si le dernier chiffre du chiffre réservé est égal à 5 ​​et qu'il y a un chiffre après le chiffre, alors le report est effectué, comme round(5.2151,2) = 5.22

Si le dernier chiffre du chiffre réservé est supérieur ou égal à 6, alors le report est effectué. Par exemple, round(5.216,2) = 5.22

>>> round(5.214,2)
5.21
>>> round(5.215,2)
5.21
>>> round(5.2151,2)
5.22
>>> round(5.216,2)
5.22
>>>

Mais il existe des exceptions à la règle 2 ci-dessus, telles que :

>>> round(0.645,2)
0.65
>>>

La raison est que les nombres à virgule flottante ne peuvent représenter que des valeurs approximatives lorsqu'ils sont exprimés en binaire. nous voyons 0,645, en réalité ce que Python stocke est 0,645000000000000017763568394002504646778106689453125 Python stocke les nombres à virgule flottante conformément à la norme IEEE754.

Parlons du cas où ndigits vaut 0 ou Aucun :

Si le dernier chiffre du chiffre réservé est inférieur ou égal à 4, alors jetez-le, comme round(1.4) = 1

Si le dernier chiffre du chiffre réservé est égal à 5, et il n'y a pas de nombre après, alors le nombre pair le plus proche est pris, comme round(1.5)=2, round(2.5)=2

Si le dernier chiffre du chiffre réservé est égal à 5, et il y a un nombre après, alors le chiffre le plus proche est pris, tel que round( 2.51)=3

Si le dernier chiffre du chiffre réservé est supérieur ou égal à 6, alors reportez-vous. Par exemple, round(1.6) = 2

>>> round(1.5)
2
>>> round(1.4)
1
>>> round(1.6)
2
>>> round(2.5)
2
>>> round(2.51)
3
>>>

Veuillez noter que le résultat retenu de la chaîne f est cohérent avec round:

>>> f"{1.5:.0f}"
'2'
>>> f"{2.5:.0f}"
'2'
>>> f"{2.51:.0f}"
'3'

Alors comment obtenir une méthode cohérente avec les règles mathématiques d'arrondi ? Veuillez utiliser la deuxième méthode :

2. Utiliser la décimale

Cette méthode a une condition préalable, c'est-à-dire que la décimale doit d'abord être convertie en chaîne, afin que les nombres à virgule flottante puissent être représentés avec précision.

import decimal

# 修改舍入方式为四舍五入
decimal.getcontext().rounding = "ROUND_HALF_UP"

x = "0.645"
x1 = decimal.Decimal(x).quantize(decimal.Decimal("0.00"))
print(f"{x} 的近似值为 {x1}")
y = "2.5"
y1 = decimal.Decimal(y).quantize(decimal.Decimal("0"))
print(f"{y} 的近似值为 {y1}")

Le résultat du programme ci-dessus est le suivant :

0.645 的近似值为 0.65
2.5 的近似值为 3

Il est entièrement conforme à notre arrondi mathématique.

Mots finaux

Les nombres à virgule flottante ne peuvent représenter que des valeurs approximatives en représentation binaire. Pour ce point, vous pouvez consulter le document [1]. Après avoir compris la représentation des nombres à virgule flottante, cela ne vous semblera pas si étrange lorsque vous examinerez les arrondis.

Références

[1] Documentation : https://docs.python.org/3/tutorial/floatingpoint.html#tut-fp-issues

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:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer