【问题标题】:Rounding positive/negative numbers to nearest "whole" number将正数/负数四舍五入到最接近的“整数”数
【发布时间】:2018-10-12 05:48:18
【问题描述】:

我正在尝试将来自 cmath 的除法函数的数字四舍五入为“整数”,由于程序的性质,结果通常为负数。

示例代码:

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

但是,这样做的结果是,由于 python 中的怪异,它总是返回更接近零而不是更远,如果在舍入之前说 str_mod 最终为 -1.5(导致 -1 而不是比 -2 根据需要)

由于我正在尝试为自定义笔和纸 RPG 系统创建自动派生统计计算脚本,因此这不是所需的行为。我希望脚本在四舍五入时返回 -1.5、-2.0。我需要能够做到这一点,同时仍然以类似的方式将正数四舍五入。

【问题讨论】:

    标签: python integer python-2.x cmath


    【解决方案1】:

    这是因为您从 strength/2 得到一个(截断的)int

    试试strength/2.0

    这不是 python 的奇怪之处,而是大多数语言如何为数字转换类型

    5/2 = 2

    5/2.0 = 2.5

    【讨论】:

    • from __future__ import division
    • 是的......但他仍然更好地理解一些他可能处理的任何其他语言的数字转换
    • (+1) 很好地弄清楚了实际问题是什么。有时input 的这些问题有点困难,因为python2 和python3 之间的类型不同。不过,你很快就搞定了。
    • 这最终是最好的答案,但不幸的是,它的用处不如它下面的那个,它指出了我的程序中的一个主要安全漏洞,以及如何修复它。谢谢。
    【解决方案2】:

    您可以安全地执行此操作:

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

    在这种情况下,由于强度保证为浮点数,因此您可以安全地除以 2,而无需担心截断或从 __future__ 导入 division。作为奖励,您还消除了游戏中的巨大安全责任。

    使用输入,用户可能会对您的系统造成严重损害:

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

    【讨论】:

    • 非常感谢您,先生。我必须记住这一点,因为我只是在学习 python。
    • 这仅适用于eval它吗?
    • @JoranBeasley -- OP 正在使用 python 2.x,缺乏真正的除法证明了这一点,input 的返回值显然是int。在 python 2.x 中,input 等价于eval(raw_input(...))
    • 啊,很高兴知道。我从未使用过输入,也没有意识到它评估了输入
    【解决方案3】:

    或者,您可以尝试:

    from __future__ import division

    为了使用 py3k 除法。 (例如结果总是浮动的)

    【讨论】:

      【解决方案4】:

      您可能需要使用Decimal 来获得与 RPG 相同的舍入。使用 Decimal,您可以将舍入模式设置为 up, down, half up, etc.

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-03-21
        • 1970-01-01
        • 2017-10-05
        • 2013-06-13
        • 2020-04-01
        • 1970-01-01
        • 2022-10-17
        相关资源
        最近更新 更多