Преобразование десятичной дроби в дроби, Java и Python дает разные выходные данные - PullRequest
0 голосов
/ 20 июня 2019

Я пытаюсь преобразовать десятичные дроби в дроби.моя программа отлично работает для других номеров.однако при попытке найти числитель и знаменатель для 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-код работает в основном на всех входах.Единственная проблема с этим одним входом.пожалуйста, укажите мне ошибку, если таковые имеются.Я был бы очень признателен, если бы вы могли предоставить мне метод или логику, которая может решить эту проблемупосле добавления limit_denominator он становится 0. Я не знаю, что здесь происходит ..

1 Ответ

1 голос
/ 20 июня 2019

Ну, отладка сразу покажет, что происходит.convertDecimalToFraction возвращает "1.0/9.15494383825455E32", что не глупо, но getDenominator просто игнорирует E32.Вы должны имитировать limit_denominator из Python и сказать, что если 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;
}
...