在Python 2.7中如何保留两位小数?

85

使用Python 2.7,如何将我的数字四舍五入到两位小数,而不是默认的十位或更多位?

print "financial return of outcome 1 =","$"+str(out1)

3
这可能会涉及一系列问题。你是否将财务数据存储在浮点数变量中,现在想要进行舍入?大多数情况下无法进行精确舍入。根据您实际尝试做的事情,您可能需要使用整数或Decimal。请注意,Decimal是Python库中的一个数据类型,可用于精确计算小数并避免浮点数舍入误差。 - Tim Pietzcker
了解格式说明符。您可以直接打印浮点数值,而无需将其转换为字符串。 - John Doe
9个回答

203
使用内置函数 round()
>>> round(1.2345,2)
1.23
>>> round(1.5145,2)
1.51
>>> round(1.679,2)
1.68

或内置函数format()

>>> format(1.2345, '.2f')
'1.23'
>>> format(1.679, '.2f')
'1.68'

或者新的格式化字符串:

>>> "{:.2f}".format(1.2345)
'1.23
>>> "{:.2f}".format(1.679)
'1.68'

或者旧式字符串格式化:

>>> "%.2f" % (1.679)
'1.68'

关于round的帮助:

>>> print round.__doc__
round(number[, ndigits]) -> floating point number

Round a number to a given precision in decimal digits (default 0 digits).
This always returns a floating point number.  Precision may be negative.

2
字符串格式化方法在使用小数时非常有用。例如:Decimal("{:.2f}".format(val)) - Patch Rick Walsh
@PatchRickWalsh 或者直接使用 Decimal(format(val, '.2f')) - Ashwini Chaudhary
9
太棒了!我不知道那个内置格式。经过更多探索,如果浮点数误差绝对不可接受,我认为这是最准确的舍入方式:Decimal('123.345').quantize(Decimal('1.00'), rounding=decimal.ROUND_HALF_UP)会得到 Decimal('123.35')。另一方面,Decimal(format(Decimal('123.345'), '.2f'))会得到 Decimal('123.34'),因为123.345的二进制表示小于123.345。 - Patch Rick Walsh

50

因为你谈论的是财务数字,所以不应该使用浮点数算术。最好使用 Decimal。

>>> from decimal import Decimal
>>> Decimal("33.505")
Decimal('33.505')

使用新风格的format()进行文本输出格式化(默认为半偶数舍入):

>>> print("financial return of outcome 1 = {:.2f}".format(Decimal("33.505")))
financial return of outcome 1 = 33.50
>>> print("financial return of outcome 1 = {:.2f}".format(Decimal("33.515")))
financial return of outcome 1 = 33.52

由于浮点数不精确导致的四舍五入差异如下所示:

>>> round(33.505, 2)
33.51
>>> round(Decimal("33.505"), 2)  # This converts back to float (wrong)
33.51
>>> Decimal(33.505)  # Don't init Decimal from floating-point
Decimal('33.50500000000000255795384873636066913604736328125')

正确的财务数值取舍方式:

>>> Decimal("33.505").quantize(Decimal("0.01"))  # Half-even rounding by default
Decimal('33.50')

在不同的交易中,还常见其他类型的四舍五入:

>>> import decimal
>>> Decimal("33.505").quantize(Decimal("0.01"), decimal.ROUND_HALF_DOWN)
Decimal('33.50')
>>> Decimal("33.505").quantize(Decimal("0.01"), decimal.ROUND_HALF_UP)
Decimal('33.51')

请记住,如果您正在模拟回报结果,则可能需要在每个利息期间进行舍入,因为您无法支付/接收分数的分数,也无法获得分数的利息。对于模拟来说,使用浮点数是相当常见的,但如果这样做,请始终记住存在误差。因此,即使是固定利率的投资,由于此原因而略有不同。


5

您也可以使用str.format()

>>> print "financial return of outcome 1 = {:.2f}".format(1.23456)
financial return of outcome 1 = 1.23

4

当使用分/整数时,您会遇到115(例如1.15美元)和其他数字的问题。

我有一个将整数转换为浮点数的函数。

...
return float(115 * 0.01)

那个函数通常可以正常工作,但有时会返回类似于 1.1500000000000001 的结果。

所以我改变了我的函数,使其返回如下...

...
return float(format(115 * 0.01, '.2f'))

这将返回1.15,而不是'1.15'1.1500000000000001(返回浮点数而非字符串)。

我大多数时候发帖是为了记住在这种情况下我所做的事情,因为这是谷歌中的第一个结果。


正如另一位答案所指出的那样,对于金融数据使用十进制数而不是浮点数。 - Bruno Le Floch
1
我最终将大部分内容转换为整数。这似乎更容易处理。但是,我没有处理任何涉及便士分数的内容。 - teewuane

2

我认为最好的方法是使用format()函数:

>>> print("financial return of outcome 1 = $ " + format(str(out1), '.2f'))
// Should print: financial return of outcome 1 = $ 752.60

但我必须说:在处理金融价值时不要使用 round 或 format。


“format”需要非字符串的f格式。否则会出现ValueError错误。正确的代码是:format(out1, '.2f'),不需要将其转换为字符串。 - danius

2

当我们使用round()函数时,它可能不会给出正确的值。

你可以通过以下方式进行检查, round(2.735)和round(2.725)

请使用

import math
num = input('Enter a number')
print(math.ceil(num*100)/100)

请添加一个您测试过的示例,结果以及您认为有什么问题。 - Liran Funaro
导入数学库 num = input('请输入一个数字') numr = float(round(num, 2)) print numr - Midhun M M

1
print "financial return of outcome 1 = $%.2f" % (out1)

0
向上舍入到最接近的0.05,我会这样做:
def roundup(x):
    return round(int(math.ceil(x / 0.05)) * 0.05,2)

0
一个相对简单的解决方法是先将浮点数转换为字符串,然后选择前四个数字的子字符串,最后将子字符串转换回浮点数。 例如:
>>> out1 = 1.2345
>>> out1 = float(str(out1)[0:4])
>>> out1

可能不是超级高效的,但简单易用 :)


2
这种方法非常不可靠。如果您的值在小数点前有多个数字,则无法获得所需的两个小数位。负数也存在同样的问题。 - André Kuhlmann

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