本文共 6864 字,大约阅读时间需要 22 分钟。
我希望将a
舍入为13.95 。
>>> a13.949999999999999>>> round(a, 2)13.949999999999999
功能不能按我预期的方式工作。
请尝试以下代码:
>>> a = 0.99334>>> a = int((a * 100) + 0.5) / 100.0 # Adding 0.5 rounds it up>>> print a0.99
使用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和JavaScript)中的浮点,我使用了这种技术
# For example:a = 70000b = 0.14c = a * bprint c # Prints 980.0000000002# Try to fixc = int(c * 10000)/100000print c # Prints 980
您还可以按以下方式使用Decimal:
from decimal import *getcontext().prec = 6Decimal(1) / Decimal(7)# Results in 6 precision -> Decimal('0.142857')getcontext().prec = 28Decimal(1) / Decimal(7)# Results in 28 precision -> Decimal('0.1428571428571428571428571429')
我觉得最简单的方法是使用format()
函数。
例如:
a = 13.949999999999999format(a, '.2f')13.95
这将产生一个浮点数作为四舍五入到小数点后两位的字符串。
要将数字四舍五入为一种分辨率,最好的方法是使用以下方法,它可以在任何分辨率下工作(0.01表示两位小数,甚至其他步长):
>>> import numpy as np>>> value = 13.949999999999999>>> resolution = 0.01>>> newValue = int(np.round(value/resolution))*resolution>>> print newValue13.95>>> resolution = 0.5>>> newValue = int(np.round(value/resolution))*resolution>>> print newValue14.0
我使用的方法是字符串切片。 这是相对快速和简单的。
首先,将float转换为字符串,然后选择所需的长度。
float = str(float)[:5]
在上面的单行中,我们将值转换为字符串,然后仅将字符串保留为其前四个数字或字符(包括首尾四个数字)。
希望有帮助!
输入/输出的舍入问题已由Python 2.7.0和3.1 彻底解决 。
正确舍入的数字可以可逆地来回转换:
str -> float() -> repr() -> float() ...
或Decimal -> float -> str -> Decimal
小数类型不再需要用于存储。 (自然地,可能有必要舍入四舍五入后的数字,以消除累积的最后一位误码的结果。显式的小数算法仍然很方便,但是可以通过str()
转换为字符串(即舍入为如果不需要极高的精度或不需要极高数量的连续算术运算,通常12个有效数字就足够了。)
无限测试 :
import randomfrom decimal import Decimalfor x in iter(random.random, None): # Verify FOREVER that is fixed :-) assert float(repr(x)) == x # Reversible repr() conversion. assert float(Decimal(repr(x))) == x assert len(repr(round(x, 10))) <= 12 # Smart decimal places in repr() after round. if x >= 0.1: # Implicit rounding to 12 significant digits assert str(x) == repr(round(x, 12)) # by str() is good enough for small errors. y = 1000 * x # Decimal type is excessive for shopping assert str(y) == repr(round(y, 12 - 3)) # in a supermaket with Python 2.7+ :-)
请参阅的第四段:
现在,在大多数平台上都可以正确舍入浮点数和字符串之间的转换 。 这些转换发生在许多不同的地方:str()代表浮点数和复数; 浮动和复杂的构造函数; 数字格式; 使用
marshal
,pickle
和json
模块对浮点数和复数进行序列化和反序列化; 在Python代码中解析float和虚数文字; 和十进制到浮点转换。与此相关的是,浮点数x的repr()现在基于最短的十进制字符串返回一个结果,该字符串保证在正确的舍入(使用“从一半到一半到四舍五入的舍入模式”下) 可以返回到x 。 以前,它根据x舍入到17个十进制数字给出了一个字符串。
更多信息: Python 2.7之前的float
格式与当前的numpy.float64
相似。 两种类型都使用相同的64位双精度和52位尾数。 一个很大的不同是np.float64.__repr__
经常使用过多的十进制数字进行格式化,因此不会丢失任何位,但是在13.949999999999999和13.950000000000001之间不存在有效的IEEE 754数字。 结果不是很好,并且numpy无法逆转repr(float(number_as_string))
。 另一方面:对float.__repr__
进行格式化,以便每个数字都很重要; 顺序没有间隙,转换是可逆的。 简单:如果您有一个numpy.float64数字,请将其转换为普通float,以便为人类(而非数字处理器)格式化,否则Python 2.7+不再需要。
内置的round()
在Python 2.7或更高版本中可以正常工作。
例:
>>> round(14.22222223, 2)14.22
查看 。
使用
print"{:.2f}".format(a)
代替
print"{0:.2f}".format(a)
因为后者在尝试输出多个变量时可能会导致输出错误(请参见注释)。
您正在浮点数的 ,即并非所有数字都可以准确表示。 命令行只是向您显示内存中的完整浮点形式。
使用浮点表示法,您的舍入版本为相同的数字。 由于计算机是二进制的,因此它们将浮点数存储为整数,然后将其除以2的幂,因此将以与125650429603636838 /(2 ** 53)相似的方式表示13.95。
双精度数字的精度为53位(16位),常规浮点数的精度为24位(8位)。 的来存储值。
例如,
>>> 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("{0:.2f}".format(a)) 13.95 >>> print("{0:.2f}".format(round(a,2))) 13.95 >>> print("{0:.15f}".format(round(a,2))) 13.949999999999999
如果仅排两个小数位(例如,显示货币值),则有两个更好的选择:
您可以修改输出格式:
>>> a = 13.95>>> a13.949999999999999>>> print "%.2f" % a13.95
它完全按照您的要求做,并且工作正常。 阅读有关更多信息,或者尝试使用对象。
大多数数字不能用浮点数精确表示。 如果要舍入该数字,因为这是您的数学公式或算法所需要的,那么您要使用舍入。 如果您只想限制显示的精度,甚至不用舍入,只需将其格式化为该字符串即可。 (如果要用其他替代的四舍五入方法显示它,并且有很多吨,则需要将两种方法混合使用。)
>>> "%.2f" % 3.14159'3.14'>>> "%.2f" % 13.9499999'13.95'
最后,虽然也许是最重要的一点,但是如果您想要精确的数学运算,那么根本就不需要浮点数。 通常的例子是处理货币并将“分”存储为整数。
Python教程有一个附录,称为“ 。 阅读。 它解释了正在发生的事情以及Python尽其所能的原因。 它甚至有一个与您匹配的示例。 让我引用一下:
>>> 0.1 0.10000000000000001您可能会想使用
round()
函数将其切回到所需的一位数字。 但这没有什么区别:>>> round(0.1, 1) 0.10000000000000001问题在于,存储为
“0.1”
的二进制浮点值已经是最好的二进制近似值,即1/10
,因此再次尝试对其进行舍入并不能使其变得更好:它已经足够好了。另一个结果是,由于
0.1
并非正好是1/10
,所以将0.1
十个值相加可能不会恰好是1.0
,或者:>>> sum = 0.0 >>> for i in range(10): ... sum += 0.1 ... >>> sum 0.99999999999999989
解决问题的一种方法是使用模块。
orig_float = 232569 / 16000.0
14.5355625
short_float = float("{:.2f}".format(orig_float))
14.54
这里似乎还没有人提到它,所以让我举一个Python 3.6的f-string / template-string格式的例子,我认为它很简洁:
>>> f'{a:.2f}'
它也适用于较长的示例,不需要运算符,也可以使用运算符:
>>> print(f'Completed in {time.time() - start:.2f}s')
正如@Matt指出的那样, Python 3.6提供了f-strings ,它们也可以使用 :
value = 2.34558precision = 2width = 4print(f'result: {value:{width}.{precision}f}')
将显示result: 2.35
在Python 2.7中:
a = 13.949999999999999output = float("%0.2f"%a)print output
from decimal import Decimaldef 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'
就像1,2,3一样简单:
使用模块进行快速正确舍入的十进制浮点运算:
d =十进制(10000000.0000009)
实现四舍五入:
d.quantize(Decimal('0.01'))
结果将为Decimal('10000000.00')
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:对他人的批评:格式不是四舍五入。
您可以使用格式运算符将值四舍五入到python中的小数点后2位:
print(format(14.4499923, '.2f')) // output is 14.45
像这样的lambda函数呢?
arred = lambda x,n : x*(10**n)//1/(10**n)
这样,您可以执行以下操作:
arred(3.141591657,2)
并得到
3.14
结合使用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>>> d2Decimal('13.95')
有新的格式规范, :
您可以执行以下操作:
"{0:.2f}".format(13.949999999999999)
请注意 ,以上代码返回一个字符串。 为了获得float,只需用float(...)
包装:
float("{0:.2f}".format(13.949999999999999))
请注意 ,使用float()
包装不会改变任何内容:
>>> x = 13.949999999999999999>>> x13.95>>> g = float("{0:.2f}".format(x))>>> g13.95>>> x == gTrue>>> h = round(x, 2)>>> h13.95>>> x == hTrue
转载地址:http://lbdnb.baihongyu.com/