【发布时间】:2014-07-20 20:41:36
【问题描述】:
在我的情况下,我试图将一个浮点数 p 除以另一个 q。顶部是底部的倍数,并且都具有以下属性:
- 完全可以用十进制表示
- 有效数字最多为 3 或 4 位
- 介于
1和1e-8之间。
(想想,例如,p=.0014 和 q=.00002)
在一个完美的世界中,除法会得到一个完美的整数(这里是 70)。但是浮点运算是often imperfect。
我想要一种最简单、最安全、最有效的方法,以避免在将商转换为 int 时返回 p/q - 1 的错误。
我现在最好的解决方案是这样做:
int(p/q + 1e-10)
但这感觉不干净,而且效率可能比可能的低。
另外,我知道我可以四舍五入,但这在代码中似乎具有误导性,并且可能比某种直接转换效率低。
【问题讨论】:
-
如果您需要精确的浮点数学运算,请使用内置的
decimal模块。 -
当且仅当您需要精确表示终止小数时,使用
decimal会有所帮助。它在代表三分之一方面并不比二进制浮点好,或者更糟的是 sqrt(2)。 -
hmm.. 四舍五入比截断少了多少?
-
round()生成一个浮点数,然后必须将其强制转换为int -
@PeterDeGlopper:我在下面实施了您的建议。它不是超级漂亮,但在我概述的情况下它可能是最安全的?这与 Aaron 给出的分数答案相比如何?
标签: python casting floating-point