Python Decimal分区给出了意想不到的答案

时间:2017-12-26 14:27:57

标签: python-3.x decimal

我不理解十进制除法背后的逻辑:

    constructor(vararg items: Item){
    val itemMap = items.fold(mutableMapOf<Int, MutableList<Item>>(), { acc, item ->
        if (acc.containsKey(item.state)) {
            acc[item.state]?.add(item)
        } else {
            acc.put(item.state, mutableListOf(item))
        }
        return acc
    })

}

这非常有效:

from decimal import *
getcontext().prec = 2

但这已经不是了:

>>> Decimal("11") / 2
 Decimal('5.5')

为什么不是“10.5”?...

2 个答案:

答案 0 :(得分:0)

在你的情况下,这是因为精度不足而发生的。 值分别舍入为Decimal上下文的“舍入”属性。

如python docs中所述,十进制上下文精度在算术运算期间起作用。 精度确定计算的准确性。这意味着根据精度值的不同,您可能会得到不同的结果。

Quote from python doc

  

广泛不同的结果表明精度不足,四舍五入   模式问题,病态输入或数值不稳定   算法

因此,您唯一需要做的就是增加小数精度值。 默认情况下,它等于28。

答案 1 :(得分:0)

十进制的上下文prec会考虑数字中的所有数字,而不仅仅是小数点后的数字。

因此,5.5有2个数字,10也有。如果您想查看10.5,则必须将精度设置为3位数。