Я пытаюсь написать программу, которая возьмет две фракции от пользователя (в форме a/b) и проведет их через определенные манипуляции и упростит результаты. Я получил правильную математику, но мне не повезло с упрощающей частью. Я получаю арифметические исключения, когда запускаю программу.Программа Java для упрощения работы фракций.
Может ли кто-нибудь указать мне правильное направление и предоставить некоторую обратную связь по моему коду?
Любые советы приветствуются и оцениваются!
Главный класс:
import java.util.*;
public class Fraction {
/**
* @param args
*/
@SuppressWarnings("resource")
public static void main(String[] args) {
Scanner input = new Scanner(System.in);
System.out.println("Please enter your first fraction:");
String frac = input.nextLine();
Driver f1 = new Driver(frac);
System.out.println("Please enter your second fraction:");
String frac2 = input.nextLine();
Driver f2 = new Driver(frac2);
Driver multiFrac = f1.multiply(f1, f2);
System.out.println("Multiplication: " +multiFrac.getNum()+ "/" + multiFrac.getDenom());
Driver divFrac = f1.divide(f1, f2);
System.out.println("Division: " + divFrac.getNum()+ "/" + divFrac.getDenom());
Driver addFrac = f1.add(f1, f2);
System.out.println("Addition: " + addFrac.getNum()+ "/" + addFrac.getDenom());
Driver subFrac = f1.sub(f1, f2);
System.out.println("Subtraction: " + subFrac.getNum()+ "/" + subFrac.getDenom());
}
}
Конструктор класса:
public class Driver {
public static int num0;
public static int denom0;
private int denom = 0;
private int num = 0;
public Driver (String frac){
String s0[] = frac.split("/");
int[] numbers0 = new int[s0.length];
for(int i = 0;i < s0.length;i++){
numbers0[i] = Integer.parseInt(s0[i]);
}
num = numbers0[0];
denom = numbers0[1];
}
public Driver(int num0, int denom0) {
num = num0;
denom = denom0;
}
public int getNum(){
int gcf= GCD(num0, denom0);
return (num/gcf);
}
public int getDenom(){
int gcf = GCD(num0, denom0);
return (denom/gcf);
}
public Driver add(Driver firstFrac, Driver secondFrac){
int denom0 = firstFrac.getDenom() * secondFrac.getDenom();
int num0 = firstFrac.getNum() * secondFrac.getDenom() + secondFrac.getNum() * firstFrac.getDenom();
this.GCD(num0, denom0);
return new Driver (num0 , denom0);
}
public Driver sub(Driver firstFrac, Driver secondFrac){
int denom0 = firstFrac.getDenom() * secondFrac.getDenom();
int num0 = (firstFrac.getNum() * secondFrac.getDenom()) - (secondFrac.getNum() * firstFrac.getDenom());
return new Driver (num0 , denom0);
}
public Driver multiply(Driver firstFrac, Driver secondFrac){
int num0 = firstFrac.getNum() * secondFrac.getNum();
int denom0 = firstFrac.getDenom() * secondFrac.getDenom();
return new Driver (num0, denom0);
}
public Driver divide(Driver firstFrac, Driver secondFrac){
int num0 = firstFrac.getNum() * secondFrac.getDenom();
int denom0 = firstFrac.getDenom() * secondFrac.getNum();
this.GCD(num0, denom0);
return new Driver (num0, denom0);
}
public int GCD(int a, int b){
if (b==0) return a;
return GCD(b,a%b);
}
}
'BigDecimal' не так полезно для фракций. 'new BigDecimal (1) .divide (новый BigDecimal (3));' генерирует исключение. –
Да, прочитайте javadocs и подумайте об использовании режима округления. Я попытаюсь проиллюстрировать OP, что не так уж хорошо требовать стандартные классы Java. –