Округление положительных / отрицательных чисел до ближайшего "целого" числа
Я пытаюсь округлить числа, полученные из функции деления в 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 !