除以负分数的问题
Issues with Dividing by Negative Fractions
我正在进行编码作业,我应该编写方法来简化、求 gcf、加、减、乘和除两个分数。我已经编写了所有的方法,但我在 divide 方法中遇到了麻烦,因为每当我尝试除以负分数(例如 -6/17)时,它都会打印 0/1 作为结果。这是我的 Fraction class 所有方法,但我添加的唯一方法是上面列出的方法。其余的都是我的导师提供的。这是 class:
class Fraction {
private int numerator = 0; // numerator (and keeps sign)
private int denominator = 1; // always stores positive value
public Fraction() {
}
public Fraction(int n, int d) {
if (set(n, d) == false)
set(0, 1);
}
public boolean set(int n, int d) {
if (d > 0) {
numerator = n;
denominator = d;
return true;
} else
return false;
}
public String toString() {
return (numerator + "/" + denominator);
}
public int getNumerator() {
return numerator;
}
public int getDenominator() {
return denominator;
}
public double decimal() {
return (double) numerator / denominator;
}
public Fraction simplify(){
int gcd = GetGcd(this);
int simpNum = this.numerator;
int simpDen = this.denominator;
simpNum /= gcd;
simpDen /= gcd;
Fraction f = new Fraction (simpNum, simpDen);
return f;
}
public int GetGcd (Fraction f){
int testNum = f.numerator;
int testDen = f.denominator;
if (testNum < 0)
testNum = 0 - testNum;
else if (testDen < 0)
testDen = 0 - testDen;
if (testNum == 0){
return testDen;
}
while (testNum != testDen){
if (testNum > testDen)
testNum -= testDen;
else
testDen -= testNum;
}
return testNum;
}
public Fraction add (Fraction f){
int cd = this.denominator * f.denominator;
int den1 = this.denominator;
int den2 = f.denominator;
int num1 = this.numerator * (cd / den1);
int num2 = f.numerator * (cd / den2);
int num3 = num1 + num2;
Fraction f2 = new Fraction (num3, cd);
f2 = f2.simplify();
return f2;
}
public Fraction subtract (Fraction f){
int cd = this.denominator * f.denominator;
int den1 = this.denominator;
int den2 = f.denominator;
int num1 = this.numerator * (cd / den1);
int num2 = f.numerator * (cd / den2);
int num3 = num1 - num2;
Fraction f2 = new Fraction (num3, cd);
f2 = f2.simplify();
return f2;
}
public Fraction multiply (Fraction f){
int den1 = this.denominator;
int den2 = f.denominator;
int num1 = this.numerator;
int num2 = f.numerator;
int num3 = num1 * num2;
int den3 = den1 * den2;
Fraction f2 = new Fraction (num3, den3);
f2 = f2.simplify();
return f2;
}
public Fraction divide (Fraction f){
int den1 = this.denominator;
int den2 = f.denominator;
int num1 = this.numerator;
int num2 = f.numerator;
int num3 = num1 * den2;
int den3 = den1 * num2;
Fraction f2 = new Fraction (num3, den3);
f2 = f2.simplify();
return f2;
}
}
我的老师给了我一个测试代码,里面有测试分数。这是:
public class FractionTester {
public static void main (String[] args) {
System.out.println("\n\nFraction tests:\n");
Fraction f1 = new Fraction(4, 6);
Fraction f2 = new Fraction(75, 175);
Fraction f3 = new Fraction(-6, 17);
System.out.println(f1 + " simplified = " + f1.simplify());
System.out.println(f2 + " simplified = " + f2.simplify());
System.out.println(f3 + " simplified = " + f3.simplify());
// show that f1, f2, f3 haven't changed
System.out.println("f1 = " + f1);
System.out.println("f2 = " + f2);
System.out.println("f3 = " + f3);
// arithmetic
System.out.println(f1 + " + " + f2 + " = " + f1.add(f2));
System.out.println(f1 + " - " + f2 + " = " + f1.subtract(f2));
System.out.println(f1 + " * " + f2 + " = " + f1.multiply(f2));
System.out.println(f1 + " / " + f2 + " = " + f1.divide(f2));
System.out.println();
System.out.println(f2 + " + " + f3 + " = " + f2.add(f3));
System.out.println(f2 + " - " + f3 + " = " + f2.subtract(f3));
System.out.println(f2 + " * " + f3 + " = " + f2.multiply(f3));
System.out.println(f2 + " / " + f3 + " = " + f2.divide(f3));
System.out.println();
// test 'division by zero' handling
Fraction zero = new Fraction();
System.out.println(f2 + " / " + zero + " = " + f2.divide(zero));
}
}
结果应如下所示:
4/6 simplified = 2/3
75/175 simplified = 3/7
-6/17 simplified = -6/17
f1 = 4/6
f2 = 75/175
f3 = -6/17
4/6 + 75/175 = 23/21
4/6 - 75/175 = 5/21
4/6 * 75/175 = 2/7
4/6 / 75/175 = 14/9
75/175 + -6/17 = 9/119
75/175 - -6/17 = 93/119
75/175 * -6/17 = -18/119
75/175 / -6/17 = -17/14 (THIS SHOWS UP AS 0/1 INSTEAD...)
75/175 / 0/1 = 0/1
我知道这是 Divide 方法中的一些东西,因为当我在最后一个中将 -6/17 更改为 6/17 时,它工作并在简化时打印 17/14。我只是不知道 Divide 方法中的什么不适用于负分数。也许我可以添加一些东西来帮助解决这个问题?提前致谢。
在divide()
,
public Fraction divide (Fraction f){
int den1 = this.denominator;
int den2 = f.denominator;
int num1 = this.numerator;
int num2 = f.numerator;
int num3 = num1 * den2;
int den3 = den1 * num2;
Fraction f2 = new Fraction (num3, den3);
...
假设 this
为正,而 f
为负。根据你的假设,
den1 > 0
den2 > 0
num1 > 0
num2 < 0
num3 = num1 * den2 > 0
den3 = den1 * num2 < 0
然而,当 new Fraction(num3, den3)
调用 set()
时,
public boolean set(int n, int d) {
if (d > 0) {
numerator = n;
denominator = d;
return true;
} else
return false;
}
当分母小于0时,返回false
,禁止将值设置到class。
您可以反转分子和分母的符号而不是简单地返回 false
。
尝试将您的 set
方法更改为:
public boolean set(int n, int d) {
if (d > 0) {
numerator = n;
denominator = d;
return true;
}
else if (d < 0) {
numerator = n * -1;
denominator = d * -1;
return true;
}
else
return false;
}
如果没有第二个 if
语句,set
将对带有负分母的分数计算为假。在这种情况下,divide
方法返回的 Fraction
将为 0/1。
我正在进行编码作业,我应该编写方法来简化、求 gcf、加、减、乘和除两个分数。我已经编写了所有的方法,但我在 divide 方法中遇到了麻烦,因为每当我尝试除以负分数(例如 -6/17)时,它都会打印 0/1 作为结果。这是我的 Fraction class 所有方法,但我添加的唯一方法是上面列出的方法。其余的都是我的导师提供的。这是 class:
class Fraction {
private int numerator = 0; // numerator (and keeps sign)
private int denominator = 1; // always stores positive value
public Fraction() {
}
public Fraction(int n, int d) {
if (set(n, d) == false)
set(0, 1);
}
public boolean set(int n, int d) {
if (d > 0) {
numerator = n;
denominator = d;
return true;
} else
return false;
}
public String toString() {
return (numerator + "/" + denominator);
}
public int getNumerator() {
return numerator;
}
public int getDenominator() {
return denominator;
}
public double decimal() {
return (double) numerator / denominator;
}
public Fraction simplify(){
int gcd = GetGcd(this);
int simpNum = this.numerator;
int simpDen = this.denominator;
simpNum /= gcd;
simpDen /= gcd;
Fraction f = new Fraction (simpNum, simpDen);
return f;
}
public int GetGcd (Fraction f){
int testNum = f.numerator;
int testDen = f.denominator;
if (testNum < 0)
testNum = 0 - testNum;
else if (testDen < 0)
testDen = 0 - testDen;
if (testNum == 0){
return testDen;
}
while (testNum != testDen){
if (testNum > testDen)
testNum -= testDen;
else
testDen -= testNum;
}
return testNum;
}
public Fraction add (Fraction f){
int cd = this.denominator * f.denominator;
int den1 = this.denominator;
int den2 = f.denominator;
int num1 = this.numerator * (cd / den1);
int num2 = f.numerator * (cd / den2);
int num3 = num1 + num2;
Fraction f2 = new Fraction (num3, cd);
f2 = f2.simplify();
return f2;
}
public Fraction subtract (Fraction f){
int cd = this.denominator * f.denominator;
int den1 = this.denominator;
int den2 = f.denominator;
int num1 = this.numerator * (cd / den1);
int num2 = f.numerator * (cd / den2);
int num3 = num1 - num2;
Fraction f2 = new Fraction (num3, cd);
f2 = f2.simplify();
return f2;
}
public Fraction multiply (Fraction f){
int den1 = this.denominator;
int den2 = f.denominator;
int num1 = this.numerator;
int num2 = f.numerator;
int num3 = num1 * num2;
int den3 = den1 * den2;
Fraction f2 = new Fraction (num3, den3);
f2 = f2.simplify();
return f2;
}
public Fraction divide (Fraction f){
int den1 = this.denominator;
int den2 = f.denominator;
int num1 = this.numerator;
int num2 = f.numerator;
int num3 = num1 * den2;
int den3 = den1 * num2;
Fraction f2 = new Fraction (num3, den3);
f2 = f2.simplify();
return f2;
}
}
我的老师给了我一个测试代码,里面有测试分数。这是:
public class FractionTester {
public static void main (String[] args) {
System.out.println("\n\nFraction tests:\n");
Fraction f1 = new Fraction(4, 6);
Fraction f2 = new Fraction(75, 175);
Fraction f3 = new Fraction(-6, 17);
System.out.println(f1 + " simplified = " + f1.simplify());
System.out.println(f2 + " simplified = " + f2.simplify());
System.out.println(f3 + " simplified = " + f3.simplify());
// show that f1, f2, f3 haven't changed
System.out.println("f1 = " + f1);
System.out.println("f2 = " + f2);
System.out.println("f3 = " + f3);
// arithmetic
System.out.println(f1 + " + " + f2 + " = " + f1.add(f2));
System.out.println(f1 + " - " + f2 + " = " + f1.subtract(f2));
System.out.println(f1 + " * " + f2 + " = " + f1.multiply(f2));
System.out.println(f1 + " / " + f2 + " = " + f1.divide(f2));
System.out.println();
System.out.println(f2 + " + " + f3 + " = " + f2.add(f3));
System.out.println(f2 + " - " + f3 + " = " + f2.subtract(f3));
System.out.println(f2 + " * " + f3 + " = " + f2.multiply(f3));
System.out.println(f2 + " / " + f3 + " = " + f2.divide(f3));
System.out.println();
// test 'division by zero' handling
Fraction zero = new Fraction();
System.out.println(f2 + " / " + zero + " = " + f2.divide(zero));
}
}
结果应如下所示:
4/6 simplified = 2/3
75/175 simplified = 3/7
-6/17 simplified = -6/17
f1 = 4/6
f2 = 75/175
f3 = -6/17
4/6 + 75/175 = 23/21
4/6 - 75/175 = 5/21
4/6 * 75/175 = 2/7
4/6 / 75/175 = 14/9
75/175 + -6/17 = 9/119
75/175 - -6/17 = 93/119
75/175 * -6/17 = -18/119
75/175 / -6/17 = -17/14 (THIS SHOWS UP AS 0/1 INSTEAD...)
75/175 / 0/1 = 0/1
我知道这是 Divide 方法中的一些东西,因为当我在最后一个中将 -6/17 更改为 6/17 时,它工作并在简化时打印 17/14。我只是不知道 Divide 方法中的什么不适用于负分数。也许我可以添加一些东西来帮助解决这个问题?提前致谢。
在divide()
,
public Fraction divide (Fraction f){
int den1 = this.denominator;
int den2 = f.denominator;
int num1 = this.numerator;
int num2 = f.numerator;
int num3 = num1 * den2;
int den3 = den1 * num2;
Fraction f2 = new Fraction (num3, den3);
...
假设 this
为正,而 f
为负。根据你的假设,
den1 > 0
den2 > 0
num1 > 0
num2 < 0
num3 = num1 * den2 > 0
den3 = den1 * num2 < 0
然而,当 new Fraction(num3, den3)
调用 set()
时,
public boolean set(int n, int d) {
if (d > 0) {
numerator = n;
denominator = d;
return true;
} else
return false;
}
当分母小于0时,返回false
,禁止将值设置到class。
您可以反转分子和分母的符号而不是简单地返回 false
。
尝试将您的 set
方法更改为:
public boolean set(int n, int d) {
if (d > 0) {
numerator = n;
denominator = d;
return true;
}
else if (d < 0) {
numerator = n * -1;
denominator = d * -1;
return true;
}
else
return false;
}
如果没有第二个 if
语句,set
将对带有负分母的分数计算为假。在这种情况下,divide
方法返回的 Fraction
将为 0/1。