如何将39.54484700000000更改为39.54并使用python

如何将39.54484700000000更改为39.54并使用python,python,floating-point,Python,Floating Point,可能重复: 我想使用python将39.54484700000000设置为39.54 如何得到它 谢谢使用round: 返回浮点值x 小数点后四舍五入到n位 指向如果省略n,则默认为 零。结果是一个浮点 号码。 值四舍五入到最接近的值 幂减n的10的倍数; 如果两个倍数相等, 舍入是从0开始的 请注意,由于39.54在我的PC(x86)上不能完全用浮点表示,因此结果是epsilon off。但这没什么区别(这是一个完全不同的问题,有很多问题和答案)。如果您正确地将其转换为字符串,您将看到您期望

可能重复:

我想使用python将
39.54484700000000
设置为
39.54

如何得到它


谢谢

使用
round

返回浮点值x 小数点后四舍五入到n位 指向如果省略n,则默认为 零。结果是一个浮点 号码。 值四舍五入到最接近的值 幂减n的10的倍数; 如果两个倍数相等, 舍入是从0开始的

请注意,由于39.54在我的PC(x86)上不能完全用浮点表示,因此结果是epsilon off。但这没什么区别(这是一个完全不同的问题,有很多问题和答案)。如果您正确地将其转换为字符串,您将看到您期望的结果:

>>> "%.2f" % round(39.544847, 2)
'39.54'

但是,请注意,结果实际上不是39.54,而是39.53999999914734871708787977695465087890625。

Eli提到使用round函数——根据您的要求,您可能希望返回十进制对象

>>> from decimal import Decimal
>>> float_val = 39.54484700000000
>>> decimal_val = Decimal("%.2f" % float_val)
>>> print decimal_val
39.54
使用Decimal对象可以指定要跟踪的精确小数位数,从而避免以表示为
39.5399999999999
的浮点数结束。具体来说,如果你在做金融计算,你几乎总是被建议远离浮点数


但是,您不能将浮点直接转换为小数(浮点不精确,Python无法猜测您希望它们如何舍入),因此我几乎总是首先将它们转换为舍入的字符串表示形式(这是
“%.2f”%float_val
-
%.2f
表示只显示两个小数,然后从中创建一个小数。

如果要更改实际值,请按照Eli的建议使用
舍入
。但是对于许多值和Python的某些版本,结果不会表示为字符串“39.54”。如果要将其四舍五入以生成一个字符串以显示给用户,则可以执行以下操作:

>>> print "%.2f" % (39.54484700000000)
39.54
或者在较新版本的Python中

>>> print("{:.2f}".format(39.54484700000000))
39.54
或者用F弦

>>> print(f'{39.54484700000000:.2f}')
39.54

相关文档:,

如何
round

>>> import decimal
>>> d=decimal.Decimal("39.54484700000000")
>>> round(d,2)
39.54
如果使用的是十进制,则可以使用该方法:

In [24]: q = Decimal('0.00')

In [25]: d = Decimal("115.79341800000000")

In [26]: d.quantize(q)
Out[26]: Decimal("115.79")

但是,我想要一个短数字,而不是长数字。@zjm1126:在什么意义上?你想打印出来吗?然后使用%.2f格式它将显示为十进制(“39.54”),但我不想获取
十进制
@zjm1126:您尝试过
打印
吗?
打印
应该将十进制对象转换为字符串,其字符串表示形式仅为“39.54”但是我不想得到字符串'39.54',我想得到
number
39.54在Python中存储普通数字的方式不能准确地表示值39.54(因为它是一个以10为基数的值,没有有限的以2为基数的表示)。您可以按照其他人的建议使用decimal.decimal类,也可以升级到Python版本,该版本可以将不精确的值转换为所需的字符串(CPython2.7+,IIRC)。首先,感谢您发布指向实际文档的链接。但是,我似乎找不到任何有关
“{.2f}”格式的内容(n)
,特别是文档中的
:.
语法?文档中的
:.
具体是做什么的?您能告诉我文档中涉及这一点的部分吗?您所说的“更改”是什么意思?根据你的问题,我们猜不到。两个都可以是字符串。然后你在做一个字符串切片。两个都可以是浮点,所以你在截断。第一个可以是浮点,第二个字符串,你在格式化。第一个可以是字符串,第二个浮点,在这种情况下,你在转换和舍入。这个问题在f中无法回答请把它修好。
>>> import decimal
>>> d=decimal.Decimal("39.54484700000000")
>>> round(d,2)
39.54
In [24]: q = Decimal('0.00')

In [25]: d = Decimal("115.79341800000000")

In [26]: d.quantize(q)
Out[26]: Decimal("115.79")