Bonjour à tous , je cherche a avoir une méthode prés-définie qui me retourne la partie décimal.
merci
Version imprimable
Bonjour à tous , je cherche a avoir une méthode prés-définie qui me retourne la partie décimal.
merci
Salut,
Tu peux passer par "modulo" comme ceci:
CiaoCode:
1
2
3 nb = 2.051 print nb%1 >>> 0.051
Ju
Il n'y aura pas un problème de précision ? Tu as testé Julien N ?
Salut Fred1599,
Oui j'ai testé avant et ça marche bien, du moins avec l'exemple donné. Mais c'est peut-être pas ce que le PO souhaitais.
Ju
Python 2.x
Python 3.xCode:
1
2
3 >>> nb = 2.051 >>> print nb%1 0.051
En effet en python 2 ça fonctionne mais pas avec la version 3...Code:
1
2
3 >>> nb = 2.051 >>> print(nb%1) 0.051000000000000156
Salut,
Ce qui change avec Python3 c'est la précision affichée par "print" mais pas le nombre lui même:
Pour le reste, il n'y a pas de fonction dans la libc qui retourne la partie décimale d'un nombre.Code:
1
2
3
4
5
6
7
8
9
10 ActivePython 2.7.2.5 (ActiveState Software Inc.) based on Python 2.7.2 (default, Jun 24 2011, 12:21:10) [MSC v.1500 32 32 Type "help", "copyright", "credits" or "license" for more inf >>> f = 2.051 >>> '%.20f' % f '2.05100000000000015632' >>> f 2.051 >>>
C'est "normal" vu la représentation des "float" plutot orientés calculs "scientifiques".
C'est em... lorsqu'on fait de la comptabilité mais dans ce cas on n'utilise pas des "float" mais plutôt Decimal ou autre.
Dommage de passer par modulo pour retourner çà: une soustraction serait plus rapide (mais un peu plus compliquée car il faut faire attention au signe).
- W
Salut Wiztricks,
Évidemment j'avais déjà testé tout cela et je m'attendais à cette réponseCitation:
C'est em... lorsqu'on fait de la comptabilité mais dans ce cas on n'utilise pas des "float" mais plutôt Decimal ou autre.
Code:
1
2
3
4 >>> from decimal import Decimal >>> nb = Decimal(nb) >>> nb - int(nb) Decimal('0.05100000000000015631940186722')
Ce que tu peux faire c'est ca :
La fonction floor(x) renvoie la partie réelle de x. Du coup, en soustrayant la partie réelle tu obtiens la partie décimale de ton nombre ! Voila voila !Code:
1
2
3 #import math ton_nombre=ton_nombre-math.floor(ton_nombre)
Non toujours pas, et celle-ci aussi je l'avais prévu ;)
Code:
1
2
3
4 >>> nb = 2.051 >>> n = nb - floor(nb) >>> n 0.051000000000000156
Que l'imprécision sur des float, ne permet pas d'avoir la valeur de la partie décimale de cette façon.Citation:
Que cherches-tu a démontrer?
La seule solution est d'utiliser les chaînes de caractères.
Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16 def getDecimal(nb): if isinstance(nb, int): dec = 0 elif isinstance(nb, float): nb = str(nb) ent, dec = nb.split('.') dec = '0.' + dec dec = float(dec) else: dec = None return dec values = (5, 2.51, "another") for val in values: print(getDecimal(val))
Code:
1
2
3
4 fred1599@fred1599-Aspire-5741G:~$ python3 test.py 0 0.51 None
Applique ton code au même contre-exemple:
Ta "solution" ne fonctionne pas.Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15 >> def getDecimal(nb): ... if isinstance(nb, int): ... dec = 0 ... elif isinstance(nb, float): ... nb = str(nb) ... ent, dec = nb.split('.') ... dec = '0.' + dec ... dec = float(dec) ... else: ... dec = None ... return dec ... >>> getDecimal(2.51-2) 0.5099999999999998 >>>
Par contre:
Autrement dit la différence entre 0.51 et 0.50999999999 est un epsilon qu'il faut de toute façon gérer lorsqu'on s'amuse avec des "float".Code:
1
2
3
4
5
6
7
8
9
10
11 >>> print ('%.2f' % (2.51 - 2)) 0.51 >>> print ('%.2f' % (2.51 - 2)) 0.51 >>> print ('%.3f' % (2.51 - 2)) 0.510 >>> print ('%.5f' % (2.51 - 2)) 0.51000 >>> print ('%.23f' % (2.51 - 2)) 0.50999999999999978683718 >>>
- W
En effet, il ne doit pas y avoir grand chose à faire, que de se faire une raison...
nb=2.051
ni=int(abs(nb))
deci=nb-ni
print(round(deci, 3))
print(type(deci))
deci=str(round(deci,3))
print(str(deci))
print(type(deci))
...
0.051
<class 'float'>
0.051
<class 'str'>
Presque 8 ans plus tard ! :D
Sinon tant qu'à faire en version dégoulasse : float('0.'+str(2.051).split('.')[1]) :)