Dans Python 3.8, j'essaie d'obtenir une valeur flottante à afficher comme suit:

  • Si le nombre a plus de 2 décimales, il doit être arrondi à 2 décimales.
  • Si le nombre a un point décimal, il doit s'afficher comme un seul point décimal.
  • Si le nombre n'a pas de point décimal, il ne doit pas du tout s'afficher avec un point décimal.

Je suis conscient de "rond". Si j'ai ce programme:

print ('input a number')
chuu = float(input())
chuu = round(chuu,2)
print (chuu)
  • L'entrée 3,141 donne 3,14 (bon)
  • L'entrée 3.1 donne 3,1 (bon)
  • L'entrée 3 donne 3.0 (mauvais, je veux 3)

Je suis également conscient que je peux faire ceci:

print ('input a number')
chuu = float(input())
print('{0:.2f}'.format(chuu))

Cela n'obtient pas non plus ce que je veux:

  • L'entrée 3,141 donne 3,14 (bon)
  • L'entrée 3.1 donne 3.10 (mauvais, je veux 3.1)
  • L'entrée 3 donne 3,00 (mauvais, je veux 3)

Comment résoudre ce problème?

0
Kim Jiwoo 5 juin 2020 à 01:23

5 réponses

Meilleure réponse

Tu pourrais simplement faire ça

print ('input a number')
chuu = float(input())
chuu = round(chuu,2)
if int(chuu)==chuu:
    print(int(chuu))
else:
    print(chuu)
3
Snehil 4 juin 2020 à 22:39

Tu veux dire quelque chose comme ca?

def specialRound(num):
    #check if has decimals
    intForm = int(num)
    if(num==intForm):
        return intForm
    TDNumber = round(num,2) #Two decimals
    ODNumber = round(num,1) #One decimal
    if(TDNumber>ODNumber):
        return TDNumber
    return ODNumber

print(specialRound(3.1415))
print(specialRound(3.10))
print(specialRound(3))
1
O.Cuenca 4 juin 2020 à 22:40

Voyez si cela vous convient!

chuu = 4.1111             #works for 4, 4.1111, 4.1

print(chuu if str(chuu).find('.')==-1 else round(chuu,2))      

Éditer:

@Mark a très précisément souligné une faille potentielle dans l'approche ci-dessus.

Voici une approche modifiée qui prend en charge de nombreuses possibilités, y compris ce que @mark a souligné.

print(chu if type(chu)!=float else ('{0:.2f}' if(len(str(chu).split('.')[-1])>=2) else '{0:.1f}').format(round(chu,2)))

Répond à toutes ces possibilités:

#Demonstration
li = [0.00005,1.100005,1.00001,0.00001,1.11111,1.111,1.01,1.1,0.0000,5,1000]
meth1 = lambda chu: chu if type(chu)!=float else ('{0:.2f}' if(len(str(chu).split('.')[-1])>=2) else '{0:.1f}').format(round(chu,2))

print(*map(meth1,li))

output
0.00 1.10 1.00 0.00 1.11 1.11 1.01 1.1 0.0 5 1000

Profile

Remarque: ne fonctionne pas avec des nombres négatifs

2
Aditya Patnaik 5 juin 2020 à 13:39

Cette solution est plus basée sur des chaînes

def dec(s):
    s = s.rstrip('.')
    if(s.find('.') == -1): 
        return s
    else:
        i = s.find('.')
        return s[:i] + '.' + s[i+1:i+3]


print(dec('3.1415'))
print(dec('3'))
print(dec('1234.5678'))
print(dec('1234.5'))
print(dec('1234.'))
print(dec('1234'))
print(dec('.5678'))

3.14
3
1234.56
1234.5
1234
1234
.56
1
Puddles 4 juin 2020 à 23:06

Vous pouvez utiliser les types de format général de mise en forme de chaîne.

print('input a number')
chuu = float(input())
print('{:g}'.format(round(chuu, 2)))
6
codeezer 4 juin 2020 à 22:43