【问题标题】:Why does Decimal modulo give the wrong sign? [duplicate]为什么十进制模会给出错误的符号? [复制]
【发布时间】:2016-03-02 11:10:54
【问题描述】:

花了很长时间才找到一个错误,这个错误基本上归结为我假设以下两个模都会返回大于 0 的结果:

>>> -0.09 % 0.1
0.010000000000000009  # OK

>>> Decimal('-0.09') % Decimal('0.1')
Decimal('-0.09')      # Not OK -- I expected a positive value!

这种行为似乎违背了Python docs

模运算符总是产生与第二个操作数符号相同(或零)的结果

这是一个错误,还是我做错了什么?

【问题讨论】:

  • 鉴于您引用的文档说“总是”,并且它不能通过将其限制为任何特定类型来限定该声明,我认为可以公平地说文档是错误的。跨度>

标签: python math modulo


【解决方案1】:

这不是错误。这是 Decimal 在 Python 中与整数或浮点数不一致的(不幸的)工作方式:

Decimal 对象的算术运算与整数和浮点数的算术运算之间存在一些细微差别。当余数运算符 % 应用于 Decimal 对象时,结果的符号是被除数的符号而不是除数的符号:

来源:https://docs.python.org/2/library/decimal.html

【讨论】:

    【解决方案2】:

    您正在查看错误的文档:您链接的段落适用于内置数字类型(尽管这并不明显)。对于decimal,您需要查看documentation of decimal。上面写着:

    remainder(x, y)

    返回整数除法的余数。

    结果的符号,如果非零,则与原始被除数的符号相同。

    此外:

    %// 运算符分别实现了 remainderdivide-integer 操作,如规范中所述。

    这种行为不一致的事实当然很烦人。

    【讨论】:

    • 文档的主要“十进制”部分也明确指出了差异:“当余数运算符 % 应用于十进制对象时,结果的符号是被除数的符号,而不是比除数的符号:"
    • 同意这种不一致很烦人;为Decimal 对象保留%// 可能会更好。
    猜你喜欢
    • 2023-03-31
    • 2021-11-18
    • 2020-12-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-08-23
    • 1970-01-01
    相关资源
    最近更新 更多