ceil()函数没有返回预期值

时间:2014-04-30 15:37:12

标签: python int ceil ceiling

我使用ceil()函数将浮点计算的结果舍入到最接近的整数。各种不同的投入都经历过......

int(ceil(A*B))

以下是一些说明问题的例子:

int(ceil(1.01*100)) = 101
int(ceil(1.02*100)) = 102
int(ceil(1.03*100)) = 103
int(ceil(1.04*100)) = 104
int(ceil(1.05*100)) = 105
int(ceil(1.06*100)) = 106
int(ceil(1.07*100)) = 107
int(ceil(1.08*100)) = 108
int(ceil(1.09*100)) = 110 ***
int(ceil(1.10*100)) = 111 ***
int(ceil(1.11*100)) = 112 ***
int(ceil(1.12*100)) = 113 ***
int(ceil(1.13*100)) = 113

我意识到这与正在执行的浮点计算有关...

1.09*100 = 109.000000.... > 109

我不知道如何可靠地捕获此错误

虽然我有几个'原油'如下所述的方法,我不认为这是一个足够强大的解决方案

int(ceil((1.09*100)-0.00000001)) = 109

2 个答案:

答案 0 :(得分:3)

您的问题既不是新的也不是特定于python的,而是浮点计算所固有的。曾经使用Fortran 4的所有dynosaurus都知道它:,因为程序员必须知道计算的预期精度ε。所以:

  • 如果| x - y | < ε
  • ,则将两个数字x和y视为等于
  • x以下的最大整数是floor(x + ε)
  • 大于x的最小整数是ceil(x - ε)

所以你提出的解决方案是好的解决方案,前提是你有办法知道ε的好处是什么。如果您正在编写模块,则应允许用户指定它。

答案 1 :(得分:2)

你是对的,问题源于浮点数的精度有限。

decimal模块是你的朋友:

from decimal import Decimal
from math import ceil

print int(ceil(Decimal("1.10") * 100))

注意,你真的必须提供数字作为字符串,否则它首先被Python解析为浮点数(这里我们得到了我们想要避免的精度问题)。