我希望`a'被四舍五入为13.95。
>>> a 13.949999999999999 >>> round(a, 2) 13.949999999999999
round函数没有按照我预期的方式工作。
round
你遇到了浮点数的老问题,不是所有的数字都能被精确表示。命令行只是向你展示了记忆中的完整浮点形式。
用浮点表示,你的四舍五入的版本是同一个数字。由于计算机是二进制的,它们将浮点数存储为整数,然后除以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("{0:.2f}".format(a)) 13.95 >>> print("{0:.2f}".format(round(a,2))) 13.95 >>> print("{0:.15f}".format(round(a,2))) 13.949999999999999
如果你只需要两个小数位(例如,显示货币值),那么你有几个更好的选择。
1.使用整数,以美分而不是美元为单位存储数值,然后除以100来转换为美元。 2.或者使用像小数这样的固定点数字。
你可以修改输出格式。
>>> a = 13.95 >>> a 13.949999999999999 >>> print "%.2f" % a 13.95
它所做的正是你告诉它要做的事,而且工作正常。阅读更多关于浮点混淆的信息,也许可以尝试用十进制对象代替。
你遇到了浮点数的老问题,不是所有的数字都能被精确表示。命令行只是向你展示了记忆中的完整浮点形式。
用浮点表示,你的四舍五入的版本是同一个数字。由于计算机是二进制的,它们将浮点数存储为整数,然后除以2的幂,所以13.95将以类似于125650429603636838/(2**53)的方式表示。
双精度的数字有53位(16位)的精度,普通的浮点数有24位(8位)的精度。Python中的浮点类型使用双精度来存储这些数值。
比如说
如果你只需要两个小数位(例如,显示货币值),那么你有几个更好的选择。
1.使用整数,以美分而不是美元为单位存储数值,然后除以100来转换为美元。 2.或者使用像小数这样的固定点数字。
你可以修改输出格式。
它所做的正是你告诉它要做的事,而且工作正常。阅读更多关于浮点混淆的信息,也许可以尝试用十进制对象代替。