将浮点数限制为小数点后两位

Limiting floats to two decimal points

提问人: 提问时间:1/19/2009 最后编辑:Karl Knechtel 更新时间:10/10/2023 访问量:5411577

问:

我想四舍五入到 13.95。我尝试使用圆形,但我得到:a

>>> a
13.949999999999999
>>> round(a, 2)
13.949999999999999

有关标准库 Decimal 类的类似问题,请参阅如何设置小数的格式以始终显示 2 位小数?

Python 浮点 舍入 精度

评论

90赞 Davoud Taghawi-Nejad 7/16/2012
重要的是不要以浮动货币表示。浮点数不精确。但是一分钱或美分的金额是整数。因此,整数是表示货币的正确方式。
13赞 SingleNegationElimination 4/13/2009
嗯。。。你想代表货币吗?如果是这样,则不应将浮点数用于美元。你可以用浮点数来表示几分钱,或者你试图建模的最小通用货币单位,但最好的做法是使用十进制表示,正如HUAGHAGUAH在他的回答中建议的那样。
6赞 Davoud Taghawi-Nejad 4/18/2014
@Basic,这取决于(大多数情况下没有)。使用以美分或便士为单位的整数是愚蠢的证明。它是代表金钱的行业标准。如果你知道自己在做什么,对浮点运算和 python 的十进制类有很好的理解,你可以使用 decimal。但这在很大程度上取决于你的问题。您需要任意精度小数吗?还是只有两位数?如果两位数:整数。它让你远离麻烦。来源:我在一家银行软件咨询公司工作。
36赞 bad_keypoints 9/22/2015
我来这里可能来得太晚了,但我想问一下,Python 的开发人员解决了这个问题吗?因为当我做 round(13.9499999999999999, 2) 时,我只会得到 13.95。我已经在 Python 2.7.6 和 3.4 中尝试过了。它有效。不确定 2009 年是否存在 2.7。也许这是 Python 2.5 的东西?
10赞 hynekcer 7/30/2016
@bad_keypoints:是的,Python 2.7.0+ 已经解决了四舍五入问题。更多在我的答案中 这里

答:

2256赞 Rex Logan 1/19/2009 #1

您遇到了浮点数的老问题,即并非所有数字都可以精确表示。命令行只是从内存中显示完整的浮点形式。

使用浮点表示时,舍入版本是相同的数字。由于计算机是二进制的,它们将浮点数存储为整数,然后将其除以 2 的幂,因此 13.95 将以类似于 125650429603636838/(2**53) 的方式表示。

双精度数字的精度为 53 位(16 位),常规浮点数的精度为 24 位(8 位)。Python 中的浮点类型使用双精度来存储值。

例如

>>> 125650429603636838/(2**53)
13.949999999999999

>>> 234042163/(2**24)
13.949999988079071

>>> a = 13.946
>>> print(a)
13.946
>>> print("%.2f" % a)
13.95
>>> round(a,2)
13.949999999999999
>>> print("%.2f" % round(a, 2))
13.95
>>> print("{:.2f}".format(a))
13.95
>>> print("{:.2f}".format(round(a, 2)))
13.95
>>> print("{:.15f}".format(round(a, 2)))
13.949999999999999

如果您只在小数点后两位(例如,显示货币值),那么您有几个更好的选择:

  1. 使用整数并以美分而不是美元为单位存储值,然后除以 100 转换为美元。
  2. 或者使用固定点数,如十进制

评论

42赞 Basic 4/8/2013
@Christian 存储的值与显示该值的方式之间存在根本区别。格式化输出应该允许您根据需要添加填充,以及添加逗号分隔符等。
31赞 andilabs 11/1/2013
值得一提的是,您不仅可以在printf中输入,还可以在诸如以下东西中输入。"%.2f" % round(a,2)str()
32赞 worc 1/12/2014
为什么人们总是在浮点四舍五入上假设货币?有时你只是想以较低的精度工作。
11赞 John Y 6/15/2016
@radtek:您需要了解二进制值(类型)只是十进制数(您作为人类所熟悉的)的最接近的可用近似值。没有像 0.245 这样的(有限可表示的)二进制值。它根本不存在,在数学上也不可能存在。最接近 0.245 的二进制值略小于 0.245,因此自然会向下舍入。同样,二进制中没有 0.225 这样的东西,但最接近 0.225 的二进制值略大于 0.225,所以自然会四舍五入。float
17赞 John Y 6/16/2016
@radtek:你确实要求解释。最直接的解决方案确实是使用 ,这是本答案中提出的解决方案之一。另一种是将数量转换为整数并使用整数算术。这两种方法也出现在其他答案和评论中。Decimal
59赞 Greg Hewgill 1/19/2009 #2

您可以修改输出格式:

>>> a = 13.95
>>> a
13.949999999999999
>>> print "%.2f" % a
13.95
13赞 HUAGHAGUAH 1/19/2009 #3

它完全按照您的指示执行操作,并且工作正常。阅读更多关于浮点混淆的信息,也许可以尝试使用十进制对象。

101赞 Roger Pate 1/19/2009 #4

大多数数字不能用浮点数精确表示。如果你想对数字进行四舍五入,因为这是你的数学公式或算法所需要的,那么你想使用四舍五入。如果您只想将显示限制在一定的精度,那么甚至不要使用 round,而只是将其格式化为该字符串。(如果你想用一些替代的舍入方法显示它,并且有吨,那么你需要混合这两种方法。

>>> "%.2f" % 3.14159
'3.14'
>>> "%.2f" % 13.9499999
'13.95'

最后,也许最重要的是,如果你想要精确的数学,那么你根本不想要浮点数。通常的例子是处理货币并将“美分”存储为整数。

24赞 nosklo 1/19/2009 #5

Python 教程有一个名为“浮点算术:问题和限制”的附录。阅读它。它解释了正在发生的事情以及为什么 Python 正在尽其所能。它甚至有一个与您的示例相匹配的示例。让我引用一点:

>>> 0.1
0.10000000000000001

您可能很想使用该功能将其切回单曲 您期望的数字。但这并不意味着 差异:round()

>>> round(0.1, 1)
0.10000000000000001

问题是二进制文件 存储的浮点值已经是最好的二进制文件 近似于 ,所以试图 再绕一圈不能让它变得更好: 它已经和它得到的一样好了。“0.1”1/10

另一个结果是,由于不完全是,将十相加 的值可能也不完全产生:0.11/100.11.0

>>> sum = 0.0
>>> for i in range(10):
...     sum += 0.1
...
>>> sum
0.99999999999999989

解决问题的另一种方法和解决方案是使用 decimal 模块。

797赞 Xolve 7/1/2011 #6

有新的格式规范,字符串格式规范迷你语言

您可以执行以下操作:

"{:.2f}".format(13.949999999999999)

注1:上面返回一个字符串。为了获得浮点数,只需用以下方法包装:float(...)

float("{:.2f}".format(13.949999999999999))

注 2:包装不会改变任何内容:float()

>>> x = 13.949999999999999999
>>> x
13.95
>>> g = float("{:.2f}".format(x))
>>> g
13.95
>>> x == g
True
>>> h = round(x, 2)
>>> h
13.95
>>> x == h
True

评论

27赞 Stephen Blum 6/20/2014
要添加逗号,也可以打印 .'{0:,.2f}'.format(1333.949999999)'1,333.95'
0赞 Jossef Harush Kadouri 8/17/2014
@OnurY ıldırım:是的,但你可以用float(); float("{0:.2f}".format(13.9499999))
5赞 Ned Batchelder 8/17/2014
@JossefHarush你可以用 float() 包装它,但你什么也没得到。现在你又有了一个浮点数,但同样不精确。13.9499999999999 和 13.95 是相同的浮点数。
4赞 Jossef Harush Kadouri 8/17/2014
@NedBatchelder:我同意它们是相等的,但这将浮点数限制在小数点后两位:)
55赞 Andrey Semakin 2/20/2019
顺便说一句,从 Python 3.6 开始,我们可以使用 f-strings:f"Result is {result:.2f}"
71赞 ax003d 8/26/2013 #7

请尝试以下代码:

>>> a = 0.99334
>>> a = int((a * 100) + 0.5) / 100.0 # Adding 0.5 rounds it up
>>> print a
0.99

评论

0赞 lifebalance 10/3/2013
但请注意,a 的值仍然是一个不精确的浮点数。请看这里 - repl.it/LJs(单击右侧顶部的“运行会话”)。
3赞 arhuaco 11/8/2013
如果采用这种方法,则应添加 0.5 以获得更准确的表示。整数(a * 100 + 0.5) / 100.0 ;使用 math.ceil 是另一种选择。
3赞 John Y 6/18/2014
@ShashankSawant:嗯,首先,所呈现的答案不是圆形的,而是截断的。在末尾添加一半的建议将四舍五入,但这样做比一开始仅使用该函数没有任何好处。另一方面,由于此解决方案仍然使用浮点,因此即使对于此“解决方案”的“更正”版本,OP 的原始问题仍然存在。round
3赞 interjay 9/13/2014
-1,这只是对函数(在问题中使用)的不必要的重新实现。round
5赞 Pithikos 2/18/2015
@interjay,如果不能像 OP 提到的那样工作,这是必要的。round()
55赞 A.J. 12/11/2013 #8

使用 Python < 3(例如 2.6 或 2.7),有两种方法可以做到这一点。

# Option one 
older_method_string = "%.9f" % numvar

# Option two (note ':' before the '.9f')
newer_method_string = "{:.9f}".format(numvar)

但请注意,对于高于 3 的 Python 版本(例如 3.2 或 3.3),首选选项 2。

有关选项二的更多信息,我建议从 Python 文档中提供有关字符串格式的链接

有关选项一的更多信息,此链接就足够了,并且包含有关各种标志的信息

参考:将浮点数转换为一定精度,然后复制到字符串

评论

0赞 skytux 12/12/2013
你如何表示整数?如果我使用“{i3}”.format(numvar),我会出错。
0赞 skytux 12/12/2013
这就是我的意思:如果 ,那么屈服但给出一个错误,我期待.numvar=12.456"{:.2f}".format(numvar)12.46"{:2i}".format(numvar)12
7赞 Siamand 4/3/2014 #9

为了修复类型动态语言(如 Python 和 JavaScript)中的浮点数,我使用了这种技术

# For example:
a = 70000
b = 0.14
c = a * b

print c # Prints 980.0000000002
# Try to fix
c = int(c * 10000)/100000
print c # Prints 980

您还可以按如下方式使用 Decimal:

from decimal import *
getcontext().prec = 6
Decimal(1) / Decimal(7)
# Results in 6 precision -> Decimal('0.142857')

getcontext().prec = 28
Decimal(1) / Decimal(7)
# Results in 28 precision -> Decimal('0.1428571428571428571428571429')

评论

1赞 Julio Marins 10/5/2017
getcontext().prec = 6仅适用于功能范围还是所有地方?
1赞 Siamand 10/5/2017
上下文是算术运算的环境。它们控制精度,设置舍入规则,确定哪些信号被视为例外,并限制指数的范围。每个线程都有自己的当前上下文@JulioMarins
181赞 grant zukowski 1/26/2015 #10

我觉得最简单的方法是使用该功能。format()

例如:

a = 13.949999999999999
format(a, '.2f')

13.95

这将生成一个四舍五入到小数点后两位的字符串形式的浮点数。

3赞 iblasi 8/26/2015 #11

要将数字四舍五入为分辨率,最好的方法是以下方法,它可以适用于任何分辨率(0.01 表示两位小数甚至其他步骤):

>>> import numpy as np
>>> value = 13.949999999999999
>>> resolution = 0.01
>>> newValue = int(np.round(value/resolution))*resolution
>>> print newValue
13.95

>>> resolution = 0.5
>>> newValue = int(np.round(value/resolution))*resolution
>>> print newValue
14.0

评论

0赞 szeitlin 4/12/2016
在 Python 3.4.3 和 Numpy 1.9.1 上对我不起作用?>>> import numpy as np >>> res = 0.01 >>> value = 0.184 >>> np.round(value/res) * res 0.1799999999999999999
1赞 iblasi 4/14/2016
在寻找文档时,我发现问题来自准确性/精确度。因此,它需要在乘以分辨率之前将其定义为 int。我更新了代码。谢谢你!numpy.round
0赞 hynekcer 4/15/2016
唯一需要的是将 np.round 的结果转换为或简单地使用 。在 13.9499999999999999 (= 1395 / 100.) 和 3.950000000000001 (= 1395 * .01) 之间不存在有效的 IEEE 754 编号。为什么你认为你的方法是最好的?原始值 13.94999999999999999289 (= value = round(value, 2)) 甚至比 13.950000000000000178(由 np.float96 打印)更精确。现在,numpy的更多信息也被添加到我的答案中,您可能错误地投了反对票。它最初与numpy无关。numpy.float64floatround(value, 2)
0赞 iblasi 4/16/2016
@hynekcer 我不认为我的答案是最好的。只是想添加一个将浮点数限制为 n 个小数的示例,但最接近定义的分辨率。我按照你说的检查过,而不是你也可以用于@szeitlin例子。感谢您的额外评论。(对不起,我没有对你投反对票)intfloat
0赞 Hejazzman 4/18/2019
为数值处理(pandas)添加全新的依赖项是“最好的方法”吗?
-19赞 tdh 12/31/2015 #12

我使用的方法是字符串切片。它相对快速和简单。

首先,将浮点数转换为字符串,选择您想要的长度。

float = str(float)[:5]

在上面的一行中,我们已将值转换为字符串,然后仅将字符串保留为前四位数字或字符(含)。

希望对您有所帮助!

评论

2赞 vaultah 12/31/2015
请不要对多个问题发布相同的答案。
20赞 Angry 84 1/8/2016
哇。。。TDH的...请不要制作任何会计软件...如果这个数字恰好是 113.94 会发生什么?这将导致 113.9 ...剩下 0.04 个......此外,这已经有 5 年多前的答案......
73赞 hynekcer 2/1/2016 #13

TLDR ;)

Python 3.1 已经明确解决了输入和输出的舍入问题,并且修复程序也向后移植到 Python 2.7.0。

四舍五入的数字可以在浮点数和字符串之间来回可逆转换
str -> float() -> repr() -> float() ...Decimal -> float -> str -> Decimal

>>> 0.3
0.3
>>> float(repr(0.3)) == 0.3
True

存储不再需要类型。Decimal

术运算的结果必须再次四舍五入,因为四舍五入误差可能会累积比解析一个数字后可能累积的更不准确。改进的算法(Python >= 3.1, >= 2.7.0)无法解决此问题:repr()

>>> 0.1 + 0.2
0.30000000000000004
>>> 0.1, 0.2, 0.3
(0.1, 0.2, 0.3)

在 Python < 2.7x 和 < 3.1 中,输出字符串函数四舍五入为 12 位有效数字,以防止类似于未固定 repr() 输出的过多无效数字。在减去非常相似的数字后,这仍然不够,而且在其他操作之后,它四舍五入太多了。Python 2.7 和 3.1 使用相同长度的 str(),尽管 repr() 是固定的。一些旧版本的 Numpy 也有过多的无效数字,即使使用固定的 Python。当前的 Numpy 是固定的。Python 版本 >= 3.2 具有相同的 str() 和 repr() 函数结果,并且在 Numpy 中也有类似函数的输出。str(float(...))


测试

import random
from decimal import Decimal
for _ in range(1000000):
    x = random.random()
    assert x == float(repr(x)) == float(Decimal(repr(x)))  # Reversible repr()
    assert str(x) == repr(x)
    assert len(repr(round(x, 12))) <= 14         # no excessive decimal places.

文档

请参阅发行说明 Python 2.7 - 其他语言更改第四段:

浮点数和字符串之间的转换现在在大多数平台上都是正确舍入的。这些转换发生在许多不同的地方:浮点数和复数上的str();float 和 complex 构造函数;数字格式;使用 、 和 模块序列化和反序列化浮点数和复数;在 Python 代码中解析浮点数和虚构文字;和十进制到浮点数的转换。marshalpicklejson

与此相关的是,浮点数 x 的 repr() 现在返回基于最短十进制字符串的结果,该字符串保证在正确的舍入下舍入回 x(使用舍入半到偶舍入模式)。以前,它给出了一个基于四舍五入 x 到 17 位十进制数字的字符串。

相关问题


更多信息:Python 2.7 之前的格式与现在的 .两种类型都使用相同的 64 位 IEEE 754 双精度和 52 位尾数。一个很大的区别是,经常使用过多的十进制数进行格式化,因此不会丢失任何位,但在 13.9499999999999999 和 13.9500000000000001 之间不存在有效的 IEEE 754 编号。结果并不好,并且使用 numpy 无法进行转换。另一方面:被格式化,使每个数字都很重要;序列没有间隙,转换是可逆的。简单地说:如果你可能有一个 numpy.float64 数字,请将其转换为普通浮点数,以便为人类格式化,而不是为数字处理器格式化,否则 Python 2.7+ 就不需要更多了。floatnumpy.float64np.float64.__repr__repr(float(number_as_string))float.__repr__

评论

0赞 hynekcer 4/15/2016
为什么投了反对票?问题是关于Python(双精度)和正常的,而不是关于numpy.double及其转换为字符串。普通的 Python 舍入真的不能比 Python 2.7 做得更好。大多数答案都是在 2.7 之前编写的,但它们已经过时了,尽管它们最初非常好。这就是我回答的原因。floatround
0赞 Rick James 5/17/2017
53 位,当您包含“隐藏位”时,这是隐式的,但在“逐渐下溢”期间除外。1
0赞 Rick James 5/17/2017
这不是圆形的错,而是显示的故障。
0赞 hynekcer 5/17/2017
是的,这是众所周知的。但是,如果您反对 Python 2.7 发行说明或我的文本中的某些内容,或者什么都不反对,我会错过上下文。这个问题的目的比必要的要复杂得多。应该补充的是,由于某些 32 位 Intel 芯片上的舍入错误,Python 2.7 中还修复了从字符串到浮点数的转换,并且“round() 函数现在也正确舍入了”。(发行说明 - 3.1 功能向后移植到 2.7)。你能同意吗?
1赞 Rick James 5/18/2017
哎呀,那是 vs .谢谢你的链接 -- 怀旧。a*bb*a
429赞 chribsen 12/31/2016 #14

内置在 Python 2.7 或更高版本中工作正常。round()

例:

>>> round(14.22222223, 2)
14.22

查看文档

评论

1赞 Michael M 9/3/2017
那么我是否应该理解这是 Python 2.7 的失败?为什么这样的基本函数会产生从 v 2.7 到 v 3 的不同结果?
1赞 jiamo 1/8/2018
但是给出为什么 Python 只提供一个 funcround(2.16, 1)2.2truncate
2赞 Melroy van den Berg 11/7/2018
例如,如果尝试将值 2.675 四舍五入到小数点后两位,则会出现以下 docs.python.org/2/tutorial/floatingpoint.html>>> round(2.675, 2) 2.67
10赞 Richard Dally 5/19/2019
来自 Python 3 文档页面:Note The behavior of round() for floats can be surprising: for example, round(2.675, 2) gives 2.67 instead of the expected 2.68. This is not a bug: it’s a result of the fact that most decimal fractions can’t be represented exactly as a float.
3赞 Josh Correia 8/4/2019
请注意,如果尝试使用此方法打印出数字(如 1.00000),则无论指定多少个小数点,它都只会打印出 1.0。
101赞 Alexey Antonenko 8/4/2017 #15

print"{:.2f}".format(a)

而不是

print"{0:.2f}".format(a)

因为后者在尝试输出多个变量时可能会导致输出错误(请参阅注释)。

评论

1赞 Alexey Antonenko 2/2/2018
我的意思是,print“{0:.2f} {0:.2f}”.format(a, b) 会导致输出错误 - 它会输出两次“a”值。而 print“{:.2f} {:.2f}”.format(a, b) 将输出 'a' 和 'b' 值。
2赞 Alexey Antonenko 2/2/2018
对于 Python 3,您只需要添加括号 print(...)。在他们里面,我写的一切都是对的。
3赞 Hovo 2/11/2018
如果有两个变量,则在print(“{0:.2f} {1:.2f}”.format(a, b))之后
7赞 MikeL 9/4/2017 #16
orig_float = 232569 / 16000.0

14.5355625

short_float = float("{:.2f}".format(orig_float)) 

14.54

346赞 Matt Fletcher 12/12/2017 #17

让我举一个 Python 3.6 的 f-string/template-string 格式的例子,我认为它非常简洁:

>>> f'{a:.2f}'

它也适用于较长的示例,带有运算符并且不需要括号:

>>> print(f'Completed in {time.time() - start:.2f}s')
35赞 toto_tico 2/1/2018 #18

正如 Matt 所指出的,Python 3.6 提供了 f 字符串,它们也可以使用嵌套参数

value = 2.34558
precision = 2
width = 4

print(f'result: {value:{width}.{precision}f}')

将显示result: 2.35

31赞 Shashank Singh 3/16/2018 #19

在 Python 2.7 中:

a = 13.949999999999999
output = float("%0.2f"%a)
print output

评论

1赞 Mark Dickinson 5/26/2018
这根本无济于事。 的值与 完全相同,因此您还不如在最后一行中写入而不是写入。outputaprint aprint output
0赞 Shashank Singh 9/23/2018
@MarkDickinson 你能再试一次吗?因为它在我的编译器中按预期运行。
1赞 Mark Dickinson 9/23/2018
你错过了我的观点。是的,您的代码会打印 .但是,对于 Python 2.7 中的这个特定值,也是如此,因此并不清楚格式化步骤的意义是什么。13.95print aa
0赞 Shashank Singh 9/23/2018
@MarkDickinson我已经编辑了代码。我同意“print a”确实打印与“print output”相同的值。但是,如果比较“a==output”,结果将为“False”,因为格式化步骤确实将浮点值“a”四舍五入到小数点后两位。
1赞 Mark Dickinson 9/23/2018
你真的尝试过你展示的代码吗?它给了我,我怀疑它也给了你。a == outputTrue
10赞 weaming 12/21/2018 #20
from decimal import Decimal


def round_float(v, ndigits=2, rt_str=False):
    d = Decimal(v)
    v_str = ("{0:.%sf}" % ndigits).format(round(d, ndigits))
    if rt_str:
        return v_str
    return Decimal(v_str)

结果:

Python 3.6.1 (default, Dec 11 2018, 17:41:10)
>>> round_float(3.1415926)
Decimal('3.14')
>>> round_float(3.1445926)
Decimal('3.14')
>>> round_float(3.1455926)
Decimal('3.15')
>>> round_float(3.1455926, rt_str=True)
'3.15'
>>> str(round_float(3.1455926))
'3.15'

评论

0赞 alper 7/18/2021
而不是我们可以回来吗?喜欢:Decimalfloatdef round_float(v, ndigits=2) -> float: d = Decimal(v); v_str = ("{0:.%sf}" % ndigits).format(round(d, ndigits)); return float(v_str)
0赞 weaming 7/20/2021
@alper您可以退回任何您喜欢的东西
8赞 Sławomir Lenart 1/30/2019 #21

这很简单,就像:

  1. 使用 decimal 模块进行快速、正确舍入的十进制浮点运算:

     d = Decimal(10000000.0000009)
    

    要实现舍入,请执行以下操作:

     d.quantize(Decimal('0.01'))
    

    将结果为Decimal('10000000.00')

  2. 进行上述 DRY

    def round_decimal(number, exponent='0.01'):
        decimal_value = Decimal(number)
        return decimal_value.quantize(Decimal(exponent))
    

    def round_decimal(number, decimal_places=2):
        decimal_value = Decimal(number)
        return decimal_value.quantize(Decimal(10) ** -decimal_places)
    

PS:对他人的批评:格式不是四舍五入。

44赞 Asad Manzoor 2/6/2019 #22

在 Python 中,您可以使用格式运算符将值四舍五入到小数点后两位:

print(format(14.4499923, '.2f')) // The output is 14.45

评论

6赞 Jemshit 3/23/2019
这将返回字符串
0赞 Arpan Saini 5/25/2021
如果我们只是想截断,如何获得它。
0赞 Peter Mortensen 9/30/2022
算子?这不是一个函数吗?
8赞 Gustavo Mirapalheta 4/28/2019 #23

使用如下所示的 lambda 函数:

arred = lambda x,n : x*(10**n)//1/(10**n)

这样你就可以做:

arred(3.141591657, 2)

并获取

3.14

评论

0赞 Peter Mortensen 9/30/2022
“arred”有什么用?这是一个葡萄牙语单词吗?
0赞 Karl Knechtel 9/30/2022
@PeterMortensen只是函数的名称,可以很容易地用 编写。在这里创建一个实际上只是为了没有特别的好处而炫耀。deflambda
0赞 Pedro Chiiip 10/10/2022
@PeterMortensen arred是“arredondamento”的缩写,在葡萄牙语中是“四舍五入”的
0赞 Gustavo Mirapalheta 10/21/2022
@Karl Knechtel,如果您使用“lambda”,则使用更少的代码行即可获得相同的结果。这就是为什么我更喜欢使用它(只要可能)而不是“def”
15赞 Jonathan L 6/1/2019 #24

结合使用 Decimal 对象和 round() 方法。

Python 3.7.3
>>> from decimal import Decimal
>>> d1 = Decimal (13.949999999999999) # define a Decimal
>>> d1 
Decimal('13.949999999999999289457264239899814128875732421875')
>>> d2 = round(d1, 2) # round to 2 decimals
>>> d2
Decimal('13.95')

评论

0赞 Ray Tayek 2/7/2022
漂亮的图标。online-go.com/user/view/179
4赞 Ray Tayek 12/17/2019 #25
lambda x, n:int(x*10^n + 0.5)/10^n

用多种语言为我工作了很多年。

评论

0赞 Ray Tayek 2/7/2022
似乎连续两个“*”消失了。
3赞 NMC 7/22/2020 #26

我看到的答案不适用于浮点数(52.15)情况。经过一些测试,我正在使用的解决方案:

import decimal
        
def value_to_decimal(value, decimal_places):
    decimal.getcontext().rounding = decimal.ROUND_HALF_UP  # define rounding method
    return decimal.Decimal(str(float(value))).quantize(decimal.Decimal('1e-{}'.format(decimal_places)))

(将“value”转换为float,然后转换为string非常重要,这样,“value”可以是float,decimal,integer或string的类型!

希望这对任何人都有帮助。

28赞 passionatedevops 9/30/2020 #27

我们有多种选择来做到这一点:

选项 1:

x = 1.090675765757
g = float("{:.2f}".format(x))
print(g)

选项 2: 内置的 round() 支持 Python 2.7 或更高版本。

x = 1.090675765757
g = round(x, 2)
print(g)

评论

2赞 Gustavo Kawamoto 10/5/2020
问题具体说明圆形方法不能做他想做的事。查看此答案以获取有关原因的更多信息
66赞 Irfan wani 11/4/2020 #28

用:

float_number = 12.234325335563
round(float_number, 2)

这将返回;

12.23

解释:

round 函数有两个参数; 要四舍五入的数字和要返回的小数位数。在这里,我返回了两位小数。

评论

2赞 Naman Jain 11/25/2020
但是,如果我们说 0.093,你怎么会得到额外的 0 来显示。这给了我 0.1 作为答案
0赞 Irfan wani 11/25/2020
如果您返回 2 位小数位或通常比左侧小数部分的零数多 1 位,那么您将得到正确的结果,例如,如果您简单地将我的答案应用于数字 0.093,它将返回 0.09,但如果您只想获得 1 位小数, 然后,当然,它将返回 0.1,因为 0.0 是完全错误的。(我的代码以同样的方式工作。也许你只想得到小数点后 1 位。如果要获得更准确的结果,则必须增加小数位数。
0赞 Arar 3/9/2021
根据文档,它不会返回十进制,这是不正确的,如果省略 ndigits 或 None,则返回值为整数。否则,返回值的类型与数字相同。ndigits 可能是负数。
0赞 aamarks 6/30/2021
所有这些虚假的选票。你的答案只是重复了十年前OP在提出这个问题时发布的代码。OP 知道 round 函数。你根本没有解决他的问题。(这个问题今天甚至不存在。
0赞 Eric 12/9/2021
这不适用于较大的数字。Round 的行为并不像人们想要的。我们想要十进制格式,而不是整数格式。99.9999999987 不应该变成 100,它应该是 99.99。这是人们想要解决的问题。简单的小数学是不费吹灰之力的。
5赞 Yogesh Yadav 11/21/2020 #29

如果你想处理钱,请使用 Python decimal 模块:

from decimal import Decimal, ROUND_HALF_UP

# 'amount' can be integer, string, tuple, float, or another Decimal object
def to_money(amount) -> Decimal:
    money = Decimal(amount).quantize(Decimal('.00'), rounding=ROUND_HALF_UP)
    return money

评论

0赞 Steve Maguire 2/6/2022
我尝试将其与DateFrame的列一起使用。收到消息:TypeError:不支持从系列到十进制的转换
6赞 Shoaib Muhammad Arif 7/29/2021 #30

这是使用 format 函数的简单解决方案。

float(format(num, '.2f'))

注意:我们正在将数字转换为浮点数,因为 format 方法返回一个字符串。

0赞 heyom 9/9/2021 #31

只需使用此函数并将字节作为输入传递给它:

def getSize(bytes):
    kb = round(bytes/1024, 4)
    mb = round(kb/1024, 4)
    gb = round(mb/1024, 4)
    if(gb > 1):
        return str(gb) + " GB"
    elif(mb > 1):
        return str(mb) + " MB"
    else:
        return str(kb) + " KB"

这是我可以将数据大小从字节动态转换为KB,MB或GB的最简单方法。

8赞 Praveen Kumar 2/5/2022 #32

简单的解决方案就在这里

value = 5.34343
rounded_value = round(value, 2) # 5.34

评论

2赞 Mark Dickinson 2/20/2022
这里有很多不必要的东西。 已是 类型,因此调用没有任何用处。直接调用 dunder 方法有点奇怪 - 相反,只需调用委托给这些 dunder 方法的函数即可。因此,拼写第一行的更好方法是 .在这一点上,你并没有真正添加其他答案中没有的任何内容。8/3floatfloatvalue = round(8/3, 2)
0赞 Praveen Kumar 2/20/2022
对不起,这个无关紧要的答案。我认为这是正确的方法。另外,在问题部分,他提到舍入方法不起作用,所以我没有检查它。
0赞 DonCarleone 6/3/2022 #33

打印百分比的单行功能:

k - 分子

n - 分母

'%.2f' - 表示您希望精度为小数点后 2 位

*100 - 将数字从小数点转换为百分比

   percentage = lambda k, n: '%.2f' % (k/n*100)

   - equivalent to-

   def percentage(k,n):
       return '%.2f' % (k/n*100)

百分比(1,3)

输出 -> '33.33'

0赞 Artur Todeschini 10/28/2022 #34

为了计算我使用一个函数来截断值 也许对你有帮助

import math


def truncate(number, digits) -> float:
    stepper = pow(10.0, digits)
    return math.trunc(stepper * number) / stepper


print(truncate((0.1 + 0.2), 2))
13赞 MD. SHIFULLAH 1/8/2023 #35

对于原始 Python:

对于将浮点数转换为字符串的 2 位小数:

a = 13.949999999999999
format(a, '.2f')

对于浮点数到浮点数点转换的 2 个小数点:

a = 13.949999999999999
round(float(a), 2)
or
float(format(a, '.2f'))
-6赞 M. Zain Aldin #36

首先将 A 转换为浮点数:

round(float(a), 2)
0赞 sai 9/20/2023 #37
def custom_round(number, decimal_places):
    multiplier = 10 ** decimal_places
    rounded_number = round(number * multiplier) / multiplier
    return rounded_number

result = custom_round(13.9456789, 2)  # Rounds to 2 decimal places
print(result)  # Output will be 13.95

评论

0赞 Destroy666 9/25/2023
请不要只发布代码并添加一个植入物,说明为什么您认为这是最佳解决方案。人们应该从你的答案中学习,如果他们只是复制粘贴代码而不知道为什么要使用它,这可能不会发生。