round()函数的文档声明您将数字传递给它,并将小数点后的位置传递给圆形 . 因此它应该这样做:
n = 5.59
round(n, 1) # 5.6
但是,实际上,良好的旧浮点怪异爬进来,你会得到:
5.5999999999999996
出于UI的目的,我需要显示 5.6
. 我在互联网上搜索并发现一些documentation这取决于我对Python的实现 . 不幸的是,这发生在我的Windows开发机器和我尝试过的每台Linux服务器上 . See here also .
没有创建我自己的圆形库,有什么方法可以解决这个问题吗?
17 回答
我无法帮助它存储的方式,但至少格式化正常:
格式化工作正常,即使不必舍入:
如果使用Decimal模块,则可以在不使用“round”功能的情况下进行近似 . 以下是我用于舍入的内容,尤其是在编写货币申请时:
这将返回十进制数16.20 .
round(5.59, 1)
工作正常 . 问题是5.6无法在二进制浮点中精确表示 .正如Vinko所说,你可以使用字符串格式来进行舍入以进行显示 .
如果你需要,Python有一个module for decimal arithmetic .
如果你做
str(round(n, 1))
而不是round(n, 1)
,你会得到'5.6' .您可以将数据类型切换为整数:
然后通过插入语言环境的小数分隔符来显示数字 .
但是,Jimmy's answer更好 .
浮点数学很容易受到轻微但令人讨厌的精确误差的影响 . 如果你可以使用整数或不动点,你将保证精度 .
看看Decimal module
和
Decimal提供了一种操作,使得编写需要浮点运算的应用程序变得容易,并且还需要以人类可读的格式(例如,会计)呈现这些结果 .
您可以使用字符串格式operator
%
,类似于sprintf .printf 傻逼 .
这确实是个大问题 . 试试这段代码:
它显示4.85 . 然后你做:
它显示4.8 . 你手动计算确切的答案是4.85,但如果你尝试:
你可以看到真相:浮点数被存储为最接近的分数的有限和,其分母是2的幂 .
作品完美
我在做:
在这种情况下,我们首先在单元级别正确舍入,然后我们转换为整数以避免打印浮点数 .
所以
我认为这个答案比形成字符串更好,而且使用圆函数对我来说也更有意义 .
码:
输出:
这是我看到圆形失败的地方 . 如果您想将这两个数字舍入到一个小数位,该怎么办? 23.45 23.55我的教育是通过四舍五入你应该得到:23.4 23.6如果前面的数字是奇数你应该向上舍入的“规则”,如果前面的数字是偶数则不是向上舍入 . python中的round函数只是截断5 .
问题是只有当最后一位数为5时 . 0.045在内部存储为0.044999999999999 ...您可以简单地将最后一位数字递增到6并舍入 . 这将为您提供所需的结果 .
关于什么: