1
votes

Comment arrondir à des nombres spécifiques et prédéfinis?

Je dois arrondir un nombre à 0, 25, 50, 75 ou 100, en python 3. Il y a d'autres threads avec des problèmes similaires, mais je ne peux pas les comprendre.

J'ai essayé arrondir les chiffres en comparant les différences, ce que j'ai probablement mal fait. (Ce code n'est pas terminé, je n'ai pas continué quand j'ai réalisé que le début ne fonctionnait pas)

Position = int(input())

RC1 = 25 - Position
RC2 = 50 - Position
RC3 = 75 - Position

if (RC1 < RC2):
    Position = 25
if (RC2 < RC3):
    Position = 50

Je voulais qu'il affiche le numéro dont il était le plus proche . par exemple. 20 tours en 25, 42 tours en 50 etc.


3 commentaires

Vos "étapes" seront-elles toujours espacées de manière uniforme?


Que signifie exactement "rond" dans ce contexte?


Ce que je voulais dire, c'est qu'il passerait au nombre le plus proche. Pas vraiment arrondi. Voici quelques exemples: 4 >>> 0 12 >>> 0 16 >>> 25 22 >>> 25 Et ainsi de suite, avec le nombre de base quel qu'il soit, pour chaque multiple de 25 jusqu'à 100. Cela a déjà été résolu. , Merci quand même.


3 Réponses :


3
votes

Vous pouvez utiliser la division et l'arrondi pour mapper le numéro à la position la plus proche:

num = int(input())

Position= (round(num/25)*25)

print(Position)


0 commentaires

2
votes

Vous pouvez utiliser quelque chose comme ceci pour déterminer les deux valeurs d'une liste prédéfinie de VALUES entre lesquelles se trouve la valeur d'entrée, puis celle qui est la plus proche. Notez que cette approche ne fait aucune hypothèse sur les valeurs de la liste, sauf qu'elles sont dans l'ordre croissant (leur permettant d'être inégalement espacées):

def pairwise(iterable):
    "s -> (s0,s1), (s1,s2), (s2, s3), ..."
    a, b = iter(iterable), iter(iterable)
    next(b, None)
    return zip(a, b)


VALUES = 0, 25, 50, 75, 100

posn = int(input("Enter position: "))

for lo, hi in pairwise(VALUES):
    if lo <= posn <= hi:
        if posn-lo < hi-posn:
            posn = lo
        else:
            posn = hi
        break
else:
    raise ValueError('A position of {} is out of range'.format(posn))

print('rounded position:', posn)


4 commentaires

Bonne réponse, mais je pense que cela peut être fait plus efficacement grâce à l'utilisation intelligente du module bisect ... Je ne sais pas exactement comment.


@Tom: Merci. Oui, cela pourrait probablement être fait avec bisect , ce qui pourrait être plus rapide (et utile) s'il y avait un très grand nombre de valeurs possibles. Je vous suggère d'essayer et de poster votre propre réponse!


@martineau: si position dans la plage (VALUES [0], VALUES [-1]); imprimer (position); else print ("out of range") pourrait être utile. +1


@ l'L'l: Bon point. Oui, j'aurais probablement dû gérer le cas lorsque la valeur de position est hors de portée - mais je pense qu'il existe un meilleur moyen en ce sens qu'il ne nécessite pas de pré-vérification de chaque valeur ... voir mise à jour.



0
votes
def round_func(position):
    VALUES = 25, 50, 75, 100
    result = 100
    if position < 0:
        return -1
    for i in VALUES:
        if position < i:
            result = i if i - position < 25 - (i - position) else i - 25
            break
    return result

print(round_func(int(input())))

0 commentaires