在2.7中舍入到小数点后两位?


82

使用Python 2.7如何将数字四舍五入到小数点后两位,而不是十位数呢?

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

2
这可能是一罐蠕虫。您是否将财务数据存储在浮点变量中,现在想对其进行舍入?在大多数情况下,不可能进行精确的舍入。您可能要使用整数或Decimals,具体取决于您实际要执行的操作。
Tim Pietzcker 2013年

了解有关格式说明符的信息。您可以直接打印浮点值,而无需将它们转换为字符串。
约翰·多伊

Answers:


198

使用内置功能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
使用十进制时,字符串格式化方法很有用。EGDecimal("{:.2f}".format(val))
补丁里克·沃尔什

@PatchRickWalsh或简单地Decimal(format(val, '.2f'))
Ashwini Chaudhary 2014年

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。
补丁里克·沃尔什(Rick Walsh)

47

既然你在谈论金融数据,你不希望使用浮点运算。最好使用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)和其他数字的问题。

我有一个将Integer转换为Float的函数。

...
return float(115 * 0.01)

大部分时间都有效,但有时会返回类似的信息1.1500000000000001

所以我将函数更改为像这样返回...

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

那将会回来1.15。不'1.15'1.1500000000000001(返回浮点数,而不是字符串)

我主要发布此内容,因此我可以记住在这种情况下所做的事情,因为这是google的第一个结果。


正如另一个答案中指出的那样,对于财务数据,请使用小数,而不是浮点数。
布鲁诺·勒弗洛奇

1
我最终将大多数东西都转换为整数。似乎更容易使用。但是,我没有做任何涉及几分钱的事情。
teewuane

2

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

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

但是我不得不说:在处理财务价值时不要使用舍入或格式。


format对于f格式,需要非字符串。如果不是,您会遇到ValueError。正确的代码是:format(out1, '.2f')不转换为字符串
danius

2

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

您可以使用舍入(2.735)和舍入(2.725)进行检查

请用

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

请添加您测试过的示例,结果以及您认为它们有什么问题。
Liran Funaro

import num num = input('Enter a number')numr = float(round(num,2))print numr
Midhun MM


0

一个相当简单的解决方法是先将float转换为字符串,选择前四个数字的子字符串,最后将子字符串转换回float。例如:

>>> out1 = 1.2345
>>> out1 = float(str(out1)[0:4])
>>> out1

可能不是超级有效,但可能简单有效:)


2
此方法非常不可靠。如果您的值在小数点前有一位以上的数字,则不会得到两个想要的小数位。同样的问题,负数。
安德烈·库尔曼(AndréKuhlmann)'18

0

四舍五入到下一个0.05,我会这样做:

def roundup(x):
    return round(int(math.ceil(x / 0.05)) * 0.05,2)
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.