1

问题:

我想以最简单的形式将浮点数转换为整数的比率。(不是这个问题的重复,请参阅下面的“编辑”)。例如,0.1= 1, 100.66666...=2, 3等。在下面的代码片段中,我尝试这样做以x = 0.1, 0.2, ..., 1.0使用此默认函数;该方法仅适用于x = 0.5x = 1.0。为什么这个算法对于其他值会失败,有x什么更好的方法来做到这一点?如果它是相关的,我的用例将是dx ~ 0.0005 = x[1] - x[0]for 0.0005 < x 10.0

代码:

import numpy as np

f = np.vectorize(lambda x : x.as_integer_ratio())

x = np.arange(0.1, 1.1, 0.1)
nums, dens = f(x)
for xi, numerator, denominator in zip(x, nums, dens):
    print("\n .. {} = {} / {}\n".format(xi, numerator, denominator))

输出:

 .. 0.1 = 3602879701896397 / 36028797018963968


 .. 0.2 = 3602879701896397 / 18014398509481984


 .. 0.30000000000000004 = 1351079888211149 / 4503599627370496


 .. 0.4 = 3602879701896397 / 9007199254740992


 .. 0.5 = 1 / 2


 .. 0.6 = 5404319552844595 / 9007199254740992


 .. 0.7000000000000001 = 6305039478318695 / 9007199254740992


 .. 0.8 = 3602879701896397 / 4503599627370496


 .. 0.9 = 8106479329266893 / 9007199254740992


 .. 1.0 = 1 / 1

编辑:

这不是真正的重复。原始问题中接受的答案的两种方法都失败了我的 MWE 的一个基本用例。要显示该Fraction模块给出了相同的错误:

import numpy as np
from fractions import Fraction

f = np.vectorize(lambda x : Fraction(x))

x = np.arange(0.1, 1.1, 0.1)
y = f(x)
print(y)

## OUTPUT
[Fraction(3602879701896397, 36028797018963968)
 Fraction(3602879701896397, 18014398509481984)
 Fraction(1351079888211149, 4503599627370496)
 Fraction(3602879701896397, 9007199254740992) Fraction(1, 2)
 Fraction(5404319552844595, 9007199254740992)
 Fraction(6305039478318695, 9007199254740992)
 Fraction(3602879701896397, 4503599627370496)
 Fraction(8106479329266893, 9007199254740992) Fraction(1, 1)]
4

0 回答 0