如何将浮点数舍入到某个小数位?

hsi*_*nxh 78 python floating-point

假设我有8.8333333333333339,我想将其转换为8.84.我怎样才能在Python中实现这一目标?

round(8.8333333333333339, 2)给予8.83而不是8.84.我是Python新手或一般编程人员.

我不想将其打印为字符串,结果将进一步使用.有关该问题的更多信息,请查看Tim Wilson的Python编程技巧:贷款和付款计算器.

mar*_*eau 98

8.833333333339(或者8.833333333333334,结果106.00/12)正确舍入到两位小数是8.83.在数学上,它听起来像你想要的是天花板功能.Python的math模块中的一个命名为ceil:

import math

v = 8.8333333333333339
print(math.ceil(v*100)/100)  # -> 8.84
Run Code Online (Sandbox Code Playgroud)

楼层和天花板功能通常将实数映射到具有零小数位的最大前一个或最小的后续整数 - 因此要将它们用于2个小数位,则首先将该数字乘以10 2(或100)以移位小数然后将它除以它以进行补偿.

如果math由于某种原因你不想使用该模块,你可以使用我刚写的这个(经过最少测试的)实现:

def ceiling(x):
    n = int(x)
    return n if n-1 < x <= n else n+1
Run Code Online (Sandbox Code Playgroud)

这如何适用于关联的贷款和付款计算器问题

贷款计算器输出的截图

从样本输出看来,它们会将每月付款进行四舍五入,这就是许多人称之为上限功能的效果.这意味着每个月略多于1/12的总量被支付.这使得最终付款比平时略小 - 仅留下剩余的未付余额8.76.

使用正常的舍入产生每月支付8.83和稍高的最终支付也是同样有效的8.87.然而,在现实世界中,人们通常不喜欢支付他们的付款,因此将每笔付款四舍五入是通常的做法 - 它还会更快地将钱返还给贷方.


Tim*_*ker 64

这是正常的(并且与Python无关)因为8.83不能完全表示为二进制浮点数,正如1/3不能精确地用十进制表示(0.333333 ... ad infinitum).

如果要确保绝对精度,则需要decimal模块:

>>> import decimal
>>> a = decimal.Decimal("8.833333333339")
>>> print(round(a,2))
8.83
Run Code Online (Sandbox Code Playgroud)


cas*_*evh 22

您想使用十进制模块,但您还需要指定舍入模式.这是一个例子:

>>> import decimal
>>> decimal.Decimal('8.333333').quantize(decimal.Decimal('.01'), rounding=decimal.ROUND_UP)
Decimal('8.34')
>>> decimal.Decimal('8.333333').quantize(decimal.Decimal('.01'), rounding=decimal.ROUND_DOWN)
Decimal('8.33')
>>> 
Run Code Online (Sandbox Code Playgroud)


use*_*471 12

一种更简单的方法是简单地使用round()函数.这是一个例子.

total_price = float()
price_1 = 2.99
price_2 = 0.99
total_price = price_1 + price_2
Run Code Online (Sandbox Code Playgroud)

如果你现在打印出total_price,你会得到

3.9800000000000004
Run Code Online (Sandbox Code Playgroud)

但是如果你将它括在round()函数中就好了

print(round(total_price,2))
Run Code Online (Sandbox Code Playgroud)

输出等于

3.98
Run Code Online (Sandbox Code Playgroud)

round()函数通过接受两个参数来工作.第一个是你要圆的数字.第二个是要舍入的小数位数.


And*_*vik 7

如果您将8.8333333333339舍入为2位小数,则正确答案为8.83,而不是8.84.你得到8.83000000001的原因是8.83是一个无法用二进制正确表示的数字,它给你最接近的数字.如果你想在没有全零的情况下进行打印,请按照VGE的说法进行操作:

print "%.2f" % 8.833333333339   #(Replace number with the variable?)
Run Code Online (Sandbox Code Playgroud)


小智 7

最简单的方法是使用以下内置函数:

format()
Run Code Online (Sandbox Code Playgroud)

例如:

format(1.242563,".2f")
Run Code Online (Sandbox Code Playgroud)

输出将是:

1.24
Run Code Online (Sandbox Code Playgroud)

相似地:

format(9.165654,".1f")
Run Code Online (Sandbox Code Playgroud)

会给:

9.2
Run Code Online (Sandbox Code Playgroud)


Ros*_*ron 5

如果你想圆,8.84是不正确的答案.8.833333333333舍入为8.83而不是8.84.如果你想要总是向上舍入,那么你可以使用math.ceil.两者都与字符串格式组合,因为舍入浮点数本身没有意义.

"%.2f" % (math.ceil(x * 100) / 100)
Run Code Online (Sandbox Code Playgroud)


小智 5

只是为了记录。你可以这样做:

def roundno(no):
    return int(no//1 + ((no%1)/0.5)//1)
Run Code Online (Sandbox Code Playgroud)

在那里,不需要包含/导入