我有两部分代码,第一部分是将分数转换为小数,第二部分是将小数转换为分数。
然而,我必须把这两段代码组合在一起,我不知道。我想让它检测输入为双精度或分数,并将其转换为另一种。
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或者别的什么,只是普通分数。