调用.as_integer_ratio()时,是否可以返回完全降低的比率?

时间:2018-11-21 00:37:18

标签: python python-3.x floating-point floating-accuracy

在一些浮动对象上调用.as_integer_ratio()时,我注意到一些奇怪的事情。例如:

(2.2).as_integer_ratio()

这将返回一个元组: (2476979795053773,1125899906842624)

我想知道能否以某种方式直接返回11/5吗?

2 个答案:

答案 0 :(得分:2)

Floating point can't actually represent most values as typed。 2.2是将值最接近2.2的便捷方式,但是2.2实际上并不存在:

>>> print('{:.16f}'.format(2.2))
2.2000000000000002

如果要使用十进制精确表示法,则需要使用the decimal module而不是float

>>> from decimal import Decimal
>>> Decimal('2.2').as_integer_ratio()  # Constructing from str is *mandatory* for proper precision
(11, 5)

答案 1 :(得分:0)

@ShadowRanger的回答是正确的。值“ 2.2”将转换为最接近的二进制分数。 ngAfterViewInit() { const filters = this.filters.map(f => f.changeFilter); console.log('oi'); this.resources = combineLatest(...filters).pipe( map((filters: ActiveFilter[]) => filters.map(filter => `${filter.group}=${filter.id}`).join('&')), switchMap(()=>this.getData())); // <------ change here } 返回该二进制分数。但是,还有其他附近的有理数在转换为浮点数时会导致相同的二进制表示形式。可以使用Stern-Brocot树来找到更简单的分数。

.as_integer_ratio()具有Stern-Brocot算法的实现,并且公开为gmpy2

.as_simple_fraction()