在Python中截断小数值

20

我正在尝试在Python中截断小数值。我不想四舍五入,而是只想显示指定精度的小数值。我尝试了以下方法:

d = 0.989434
'{:.{prec}f}'.format(d, prec=2)

这会将其舍入为0.99。但我实际上希望输出为0.98。显然,round()不是一个选项。有什么办法可以做到这一点吗?还是我应该回到代码并将所有内容更改为decimal

谢谢。


嗯,不确定是否有一种使用字符串格式化的方法来实现这个。我会进行一些研究 :) - James Mills
请提供更多答案。我们绝对需要更多。 - RickyA
1
这不是一个 decimal.Decimal,而是一个 float - Eric
12个回答

17

你可以使用以下代码

import decimal
d = 0.989434

print decimal.Decimal(d).quantize(decimal.Decimal('.01'), rounding=decimal.ROUND_DOWN)

9

我不知道你的所有要求,但这将非常健壮。

>> before_dec, after_dec = str(d).split('.')
>> float('.'.join((before_dec, after_dec[0:2])))
0.98

2018-01-03 编辑

这个答案不够健壮,也不是数学上正确的。请参见下面Nilani Algiriyage的答案,使用Decimal.quantize方法进行正确处理。


1
after_dec[:2]就足够了 :) - thefourtheye
1
为什么你接受这个解决方案呢?:) 我会觉得基于数学的解决方案更加健壮一些! - James Mills
1
只是好奇而已 :) 我个人会使用“Decimal”或其他基于数学的解决方案!我完全忘记了浮点字符串格式说明符会进行四舍五入! :/ - James Mills
是的,我也很好奇楼主的意见,但如果我要猜的话,数学会让它更难理解,并且在这种情况下并不必要。 - Derek Litz
1
如果我要猜的话:他可能只想在一个数字上这样做,一旦他得到了可行的解决方案,就接受了它,而不费心去阅读其他的... - Kraay89
显示剩余9条评论

6
d = 0.989434
print floor(d * 100) / 100

Math.floor(x) 返回 x 的下取整值,即小于或等于 x 的最大整数。

将小数 '.' 左边的 2 位数字移动,然后向下取整,最后再移回 '.' 右边的数字。

可以通过以下方式修改 100:

n = 2
m = pow (10, n)
d = 0.989434
print floor(d * m) / m

n 是你想要的精度。

编辑: 如果 d 是负数,则必须使用 ceil 方法。

if d < 0:
    print ceil(d * m) / m
else:
    print floor(d * m) / m

1
请注意,对于 d = -0.989434,这将打印出 -0.99 - Eric

3

将其格式化为更长的内容,然后截断额外的数字:

def truncate(f, digits):
    return ("{:.30f}".format(f))[:-30+digits]

1
这并不高效,但似乎是唯一没有破坏边缘情况的答案。 - Veedrac

3

我认为这是最好的方法。

  1. Move the significant digits to the left
  2. Truncate the decimal part
  3. Move the number of digits moved to left, to right

    d = 0.989434
    print "{0:0.2f}".format(int(d * 100)/100.0)
    

    Output

    0.98
    

3
import math

d = 0.989434
prec = 2
output = math.floor(d * (10 ** prec)) / (10 ** prec)

如果你仍然希望使用十进制变量而不是字符串

请注意,对于 d = -0.989434,这将打印 -0.99 - Eric
@Eric 是的,你说得对!这来自于“floor”的定义。似乎最好使用字符串格式化。 :) - Ray

1
也包括数学方面的内容:
d = 0.989434
x = int(d * 100.0) / 100.0
print "{0:0.2f}".format(x)

1
下面的代码将在这种情况下打印0.98,但是您必须小心,确保您的d值不会变得大于或等于10,否则它只会打印例如10.1而不是10.12。
d = 0.989434
print '{:.{prec}s}'.format(str(d), prec=4)

我遇到了一个错误... 对于类型为'str'的对象,未知格式代码'f'。 - visakh
抱歉,是我忘记在字符串格式化中将“f”更改为“s”。我已经进行了修改。 - Ffisegydd

1
使用`str`:
d = str(0.989434)
print float(d[:d.find('.')+3])

1
如果你只需要展示,可以将其转换为字符串并切割:
d = 0.989434
print str(d)[0:4] #or print(str(d)[0:4])

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接