对于家庭作业,我应该使用以下驱动程序来输出两个输入分数的总和和乘积,既作为分数又作为 double 。
问题是我创建的 Add() 方法不断返回“0/0 NaN”,而 Multiply() 方法不断返回“1/1 1.0”。我一直在尝试很多不同的事情,但我不知道如何从驱动程序中获取覆盖新分数的方法。
这是我的司机:
import java.util.Scanner;
public class FractionDriver {
/**
* @param args
*/
public static void main(String[] args)
{
Scanner stdIn = new Scanner(System.in);
Fraction c, d, x; // Fraction objects
System.out.println("Enter numerator; then denominator.");
c = new Fraction(stdIn.nextInt(), stdIn.nextInt());
c.print();
System.out.println("Enter numerator; then denominator.");
d = new Fraction(stdIn.nextInt(), stdIn.nextInt());
d.print();
x = new Fraction(); // create a fraction for number 0
System.out.println("Sum:");
x.add(c).add(d);
x.print();
x.printAsDouble();
x = new Fraction(1, 1); // create a fraction for number 1
System.out.println("Product:");
x.multiply(c).multiply(d);
x.print();
x.printAsDouble();
System.out.println("Enter numerator; then denominator.");
x = new Fraction(stdIn.nextInt(), stdIn.nextInt());
x.printAsDouble();
} // end main
} //end class
这是我的分数类:
package ch6;
public class Fraction
{
private int numerator;
private int denominator;
//*************************************************************
public Fraction()
{
}
//*************************************************************
public Fraction(int numerator, int denominator)
{
this.numerator = numerator;
this.denominator = denominator;
}
//**************************************************************
public int getNumerator()
{
return this.denominator;
}
//**************************************************************
public int getDenominator()
{
return this.denominator;
}
//**************************************************************
public Fraction add(Fraction c)
{
denominator = this.getDenominator() * c.getDenominator();
numerator = this.getNumerator() * c.getDenominator() + c.getNumerator() * this.getDenominator();
return new Fraction (numerator, denominator);
}
//**************************************************************
public Fraction multiply(Fraction c)
{
int productNumerator = this.numerator * c.numerator;
int productDenominator = this.denominator * c.denominator;
return new Fraction(productNumerator, productDenominator);
}
//**************************************************************
public void print()
{
System.out.println(this.numerator + "/" + this.denominator);
}
//**************************************************************
public void printAsDouble()
{
System.out.println((double) this.numerator / this.denominator);
}
}
最佳答案
您错误地用分子和分母分别为 0
来表示值 0。该值 0/0
在数学中是不确定的,并且在浮点运算中会产生 NaN
。
尝试使用数学上正确的零,表示为分子 0 和分母 1。
// Creates zero.
public Fraction()
{
this.numerator = 0; // This line is unnecessary, as default is 0.
this.denominator = 1;
}
此外,在您的 add
方法中,您将返回一个新的分数
,但您也会更改分子
和分母当前
。与分数
的乘法
类似,您需要创建局部变量来存储新的分子和新分母,以避免更改当前的分数
。
// Declare them as "int" local variables.
int denominator = this.getDenominator() * c.getDenominator();
int numerator = this.getNumerator() * c.getDenominator() +
c.getNumerator() * this.getDenominator();
顺便说一句,正如 @MarcB 已经在评论中指出的那样,这是错误的:
public int getNumerator()
{
return this.denominator;
}
将其更改为返回分子!
关于Java Add() 和 Multiply() 方法返回 0/0 和 1/1?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22307112/