分数-十进制(反之亦然)转换器



我有两部分代码,第一部分是将分数转换为小数,第二部分是将小数转换为分数。

然而,我必须把这两段代码组合在一起,我不知道。我想让它检测输入为双精度或分数,并将其转换为另一种。

import java.util.*;
public class ExcerciseEleven  {
    public static void main (String[] args) {
        Scanner sc = new Scanner (System.in);
        System.out.println("Enter Numerator: ");
        int numerator = sc.nextInt();
        System.out.println("Enter Denominator: ");
        int denominator = sc.nextInt();
        if (denominator == 0) {
            System.out.println("Can't divide by zero");
        }
        else {
            double fraction = (double)numerator / denominator;
            System.out.println(fraction);
        }
    }
}


public class Fractions {
    public static void main(String args[]) {
        double decimal;
        double originalDecimal;
        int LIMIT = 12;
        int denominators[] = new int[LIMIT + 1];
        int numerator, denominator, temp;
        int MAX_GOODNESS = 100;
        // Get a number to be converted to a fraction
        if (args.length == 1) {
            decimal = Double.valueOf(args[0]).doubleValue();
        } else {
            // No number was given, so just use pi
            assert args.length == 0; 
            decimal = Math.PI;
        }
        originalDecimal = decimal;
        // Display the header information
        System.out.println("-------------------------------------------------------");
        System.out.println("Program by David Matuszek");
        System.out.println("Input decimal number to be converted: " + decimal);
        System.out.println();
        // Compute all the denominators
        System.out.println("All computed denominators:");
        int i = 0;
        while (i < LIMIT + 1) {
            denominators[i] = (int)decimal;
            System.out.print(denominators[i] + "  ");
            decimal = 1.0 / (decimal - denominators[i]);
            i = i + 1;
        }
        System.out.println();
        System.out.println();
        // Compute the i-th approximation
        int last = 0;
        while (last < LIMIT) {
            // Print out the denominators used in this computation
            System.out.print("Using these " + (last + 1) + " denominators: ");
            for (int j = 0; j <= last; j++) {
                System.out.print(denominators[j] + "  ");
            }
            System.out.println();
            // Initialize variables used in computation
            numerator = 1;
            denominator = 1;
            temp = 0;
            // Do the computation
            int current = last;
            while (current >= 0) {
                denominator = numerator;
                numerator = (numerator * denominators[current]) + temp;
                temp = denominator;
                current = current - 1;
            }
            last = last + 1;
            // Display results
            double value = (double)numerator/denominator;
            int goodness = denominators[last];
            double error = 100 * Math.abs(value - originalDecimal) / originalDecimal;
            System.out.print("fraction = " + (int)numerator + "/" +
                             (int)denominator);
            System.out.print(", value = " + value);
            System.out.print(", goodness = " + goodness);
            System.out.println(", error = " + (int)error + "%");
            System.out.println();
            // Exit early if we have reached our goodness criterion
            if (Math.abs(goodness) > MAX_GOODNESS) break;
        }        
    }
}

如果我在一个提示符上完成所有操作,我将创建两个静态方法Fraction.TryParse(),并且我将使用内置的Double.TryParse(),如果是十进制的。TryParse返回true,那么你确实有一个小数。如果它返回false,那么你有一个Fraction,因此你必须使用在Fraction. tryparse()中传递给Decimal.TryParse()的相同字符串。当然,您需要在Fraction.TryParse()方法中进行一些完整性检查。提示符看起来像这样:

Enter Decimal/Fraction: 3.14
Enter Decimal/Fraction: 1 + 1/2
Enter Decimal/Fraction: 1 1/2
Enter Decimal/Fraction: 1 (1/2)

你看,如果你想把这些都放在一行,你需要一些方法来分隔字符,比如空格,括号,或者简单的+号,这在数学上是准确的。如果它都在一行上,它也会稍微简化你的程序,因为你不会为一个对象有多个提示。"1(1/2)"的输入在数学上是不精确的,但你可以看到数据应该是如何结构的,你只是不能在数学上严格遵守这个提示。

这里我用的是分数1和1/2,你的实现没有带分数的实现,但是你可以输入1/2或者别的什么,只是普通分数。

最新更新