python中的四舍五入到2位小数

python中的四舍五入到2位小数,python,rounding,Python,Rounding,我需要四舍五入,应该是小数点后两位。 尝试了以下方法 a = 28.266 print round(a, 2) 28.27 但预期值仅为28.26。似乎您需要楼层: import math math.floor(a * 100)/100.0 # 28.26 简单地尝试一下: import math a = 28.266 print((math.floor(a * 100)) / 100.0) 输出: 28.26 看起来你想要的是截断,而不是四舍五入 一种简单的方法是将楼层划分与常规划分

我需要四舍五入,应该是小数点后两位。
尝试了以下方法

a = 28.266
print round(a, 2)
28.27


但预期值仅为28.26。

似乎您需要
楼层:

import math
math.floor(a * 100)/100.0

# 28.26
简单地尝试一下:

import math
a = 28.266
print((math.floor(a * 100)) / 100.0)
输出:

28.26

看起来你想要的是截断,而不是四舍五入

一种简单的方法是将楼层划分与常规划分结合起来:

>a=28.266
>>>a//0.01/100
28.26
除常规除法外,您还可以将其相乘(如注释中所述):

>>a//0.01*0.01
28.26
类似地,您可以创建一个函数来向下舍入到其他更多/更少的小数。但由于浮动是不精确的数字,这可能导致不准确

def向下取整(值,小数):
系数=1/(10**小数)
返回(值//因子)*因子
打印(向下舍入(28.266,2))
# 28.26
但正如所说,这并不完全准确:

范围(0,8)内的i的
:
打印(i,向下舍入(12.33333,i))
012.0
1 12.3
2 12.33
3 12.333
412.3333000000000001#奇怪,但几乎正确
5 12.33332#错
6 12.33333
7 12.33333
不过,还有其他(更精确的)方法:

使用
分数
模块的解决方案
分数
可以表示比
浮点
更精确的十进制数。然后可以使用Psidom提到的“乘、底、除”方法,但精度要高得多:

导入分数
输入数学
a=28.266
def向下舍入(值,小数):
系数=10**小数
f=分数。分数(值)
返回分数。分数(数学下限(f*因子),因子)
打印(向下舍入(28.266,2))

#1413/50一般来说,还有一种更简单的方法,在四舍五入之前减去一小部分,如下所示:

a = 28.269
digits = 2
print(round(a - 0.5/10**digits, digits))

这是基于一种直觉,即将浮点四舍五入到最接近的整数的一种方法是加0.5,然后截断。上述解决方案通过减去所需精度允许的最小“勾号”的一半,然后四舍五入来实现相反的效果。

这里有一个简单的函数,不受浮点精度误差的影响

def truncate_float(n, places):
    return int(n * (10 ** places)) / 10 ** places
测试:

>>> truncate_float(28.266, 3)
28.266
>>> truncate_float(28.266, 2)
28.26
>>> truncate_float(28.266, 1)
28.2

在Python3.9中,可以使用quantize()

我测试了上面的答案,它成功了。但我发现这一行很简单。所以我也在这里写下我的答案


来源:

您要截断。看看这里:@zinjaai是正确的一半的时间,如果你参考顶部的答案。但是,考虑注释<代码> %.3f '%(1324343032.3243)和'%.3f '%(1324343032.3245)给出不同的结果< /代码>,这是因为顶部答案实际上相当于舍入。我只想在这里使用@Psidom的答案。如果使用
digits=3
,则结果是
28.268
——这是不正确的。你是对的,某些值有时不正确。这是因为round()使用了round-half-偶数模式吗?我认为区别在于浮点是不精确的,
a-0.5/10**digits
实际上是
28.2684999999999516830939683132…
对于
digits=3
。然而,
28.269
也不能准确地表示为float:
28.2689999999998351540836568…
。这就是为什么我的答案还显示了如何使用
分数
小数
对值进行四舍五入,因为分数是“真正精确的”,小数几乎总是“足够精确”(至少如果输入是以字符串形式给出(而不是以浮点形式给出)@user2682863我的示例中提到的一些解决方案会受到浮点不精确性的影响。但我注意到,在每种方法中,最后两个分数和小数的解决方案不会受到影响。
from decimal import *    
>>> Decimal('7.325').quantize(Decimal('.01'), rounding=ROUND_DOWN)
Decimal('7.32')