将十进制转换为分数,java和python提供不同的输出

时间:2019-06-20 11:12:36

标签: java python-3.x fractions

我正在尝试将小数转换为分数。我的程序可以很好地处理其他数字。但是,当尝试找到1.0923059908040425e-33的分子和分母时,

java给出1/9 如python给出0。

这是我的Java代码:

class Rational {
public static void main(String[] args) {
     println(getDenominator(convertDecimalToFraction(1.0923059908040425e-33)));
}

public static int getNumerator(String fraction) {
    return Integer.valueOf(fraction.substring(0, fraction.indexOf(".")));
}
public static int getDenominator(String fraction) {
    fraction = fraction.substring(fraction.indexOf("/") + 1);
    return Integer.valueOf(fraction.substring(0, fraction.indexOf(".")));
}

static private String convertDecimalToFraction(double x){
    if (x < 0){
        return "-" + convertDecimalToFraction(-x);
    }
    double tolerance = 1.0E-6;
    double h1=1; double h2=0;
    double k1=0; double k2=1;
    double b = x;
    do {
        double a = Math.floor(b);
        double aux = h1; h1 = a*h1+h2; h2 = aux;
        aux = k1; k1 = a*k1+k2; k2 = aux;
        b = 1/(b-a);
    } while (Math.abs(x-h1/k1) > x*tolerance);

    return h1+"/"+k1;
}
}

这是python:

print(fractions.Fraction(1.0923059908040425e-33).limit_denominator())

我认为我的Java代码中存在问题,因为我期望0作为正确的输出,但是有内置的库可用于小数部分,并且我不想使用任何第三方库。

java代码几乎可用于所有输入。这个输入唯一的问题。请指出错误。 如果您能为我提供可以解决此问题的方法或逻辑,我将不胜感激


print(fractions.Fraction(1.0923059908040425e-33))给出6385627976105849/5846006549323611672814739330865132078623730171904

加上limit_denominator后,它变为0。 我不知道这是怎么回事。

1 个答案:

答案 0 :(得分:1)

好一点,调试会立即显示发生了什么。 convertDecimalToFraction返回的"1.0/9.15494383825455E32"并不愚蠢,但是getDenominator只是忽略了E32。您应该模仿Python中的limit_denominator,并说如果x<tolerance,则返回的值应为"0./1."

static private String convertDecimalToFraction(double x){
    if (x < 0){
        return "-" + convertDecimalToFraction(-x);
    }
    double tolerance = 1.0E-6;
    if (x < tolerance) {
        return "0./1.";
    }
    double h1=1; double h2=0;
    double k1=0; double k2=1;
    double b = x;
    do {
        double a = Math.floor(b);
        double aux = h1; h1 = a*h1+h2; h2 = aux;
        aux = k1; k1 = a*k1+k2; k2 = aux;
        b = 1/(b-a);
    } while (Math.abs(x-h1/k1) > x*tolerance);

    return h1+"/"+k1;
}