如何正确地将float / decimal截断到python中的小数后的特定位置?

时间:2013-05-02 14:16:22

标签: python truncate

在Python 2.7.3中,这是当前的行为:

>>> 8./9.
0.8888888888888888
>>> '%.1f' % (8./9.)
'0.9'

Decimal s似乎也是如此:

>>> from decimal import Decimal
>>> Decimal(8) / Decimal(9)
Decimal('0.8888888888888888888888888889')
>>> '%.1f' % (Decimal(8) / Decimal(9))
'0.9'

我原本期望截断,但它似乎是圆的。那么我可以选择截断到十分位置吗?

我想问,因为我现在的解决方案看起来很糟糕(但也许是最好的做法?)因为它会产生一个结果字符串,找到句点并在我想要的句号后找到X位数。

3 个答案:

答案 0 :(得分:3)

您正在寻找math.floor() function

>>> import math
>>> math.floor(8./9. * 10) / 10
0.8

答案 1 :(得分:1)

  

所以我选择截断到十分位置?

Decimal.quantize()方法将数字四舍五入为固定指数,并提供对舍入模式的控制:

>>> from decimal import Decimal, ROUND_FLOOR
>>> Decimal('0.9876').quantize(Decimal('0.1'), rounding=ROUND_FLOOR)
Decimal('0.9')

不要在十进制值上使用math.floor,因为它首先将它们强制转换为引入表示错误和精度丢失的二进制浮点数:

>>> x = Decimal('1.999999999999999999998')
>>> x.quantize(Decimal('0.1'), rounding=ROUND_FLOOR)
Decimal('1.9')
>>> math.floor(x * 10) / 10
2.0

答案 2 :(得分:0)

乘以10,然后将值放下。

用某种语言:

float f = 1/3;
print(f) //Prints 0,3333333333

float q = Math.floor(f*10)/10
print(q) //Prints 0,3