Округление положительных / отрицательных чисел до ближайшего "целого" числа

Я пытаюсь округлить числа, полученные из функции деления в cmath, до "целого" числа, результаты которого часто бывают отрицательными из-за характера программы.

Пример кода:

strength = input("Input Strength Stat: ")
str_mod = round(strength/2)

Тем не менее, результатом этого является то, что он, из-за странности в Python, всегда возвращается ближе к нулю, а не дальше, если, скажем, str_mod до округления получается что-то вроде -1,5 (в результате -1, а не -2 по желанию)

Это потому, что я пытаюсь создать сценарий автоматического вычисления статистики для пользовательской системы RPG с ручкой и бумагой, это нежелательное поведение. То, что я хочу, чтобы сценарий вернулся, в -1,5, -2,0 после округления. Я должен быть в состоянии сделать это, все еще округляя положительные числа аналогичным образом.

5 ответов

Решение

Вы можете сделать это безопасным способом:

strength = float(raw_input("Input Strength Stat:"))
str_mod = round(strength/2)

В этом случае, поскольку прочность гарантированно является плавающей, вы можете безопасно разделить на 2, не беспокоясь об усечении или импорте division от __future__, В качестве бонуса вы также снимаете огромную ответственность за безопасность в вашей игре.

Используя ввод, пользователь может нанести серьезный ущерб вашей системе:

RPG console> Input Strength Stat: __import__('os').system('rm -r ~')
                                 #^ User input (don't try this!)

Это потому что вы получаете (усеченный) int от strength/2

пытаться strength/2.0

это не странность с питоном, а просто то, как большинство языков приводят типы для чисел

5/2 = 2

5 / 2,0 = 2,5

В качестве альтернативы вы можете попробовать:

from __future__ import division

чтобы использовать деление py3k. (например, результат всегда будет плавающим)

Возможно, вам придется использовать десятичное число, чтобы получить то же округление, что и в RPG. В десятичной системе вы можете установить режим округления вверх, вниз, наполовину и т. Д.

Если я правильно понимаю вашу проблему, вам нужно что-то, что округлит половину от нуля , например:

-0,5 -> -1

0,5 -> 1

У этих людей есть хорошие ответы. В частности, я основывал свой ответ ниже на ответе

      from math import floor, ceil

strength = float(raw_input("Input Strength Stat:"))
str_mod  = floor((strength/2) + 0.5) if strength  >= 0.0 else ceil((strength/2)  - 0.5)

Спасибо user8033585 !

Другие вопросы по тегам