我需要用Java编写一个方法,比较三个有理数(随机生成)并返回最小和最大数。下面您将看到我编写了一个方法来比较并返回最大值,另一个方法来比较并返回最小值。
使用下面的两种方法,我在大多数情况下都能获得正确的最小值和最大值。但是,每隔几次运行,我就会得到不正确的最小值和/或最大值。我试图比较各种输入数据和结果,以准确了解错误发生的位置以及为什么它看起来显然是随机的,但我在错误答案之间找不到任何模式。
为了澄清起见,程序首先生成三个随机分子和三个随机分母,然后使用这些数字形成有理数(a/b)。然后,完成的程序输出最大值、最小值、总和和平均值(首先是有理数格式,然后是浮点格式)。我的求和和平均值方法每次都给出正确的结果。问题似乎出在getMax和getMinimum方法中。大约 80% 的时间,程序会给出正确的最小值和最大值。
下面您将找到我遇到问题的两种方法以及它们在我的主程序中的调用。还有一个我使用的 Die 类,但没有问题,所以不包括在内。请让我知道可能导致随机错误的最大和最小输出的原因(特别是在 getMaximum 和 getMinimum 方法中)谢谢。
//Method to compare rational numbers and return the largest rational
public Rational getMaximum(Rational r1,Rational r2)
{
float d1, d2, d3;
d1 = (numerator/denominator);
d2 = (r1.getNumerator() / r1.getDenominator());
d3 = (r2.getNumerator() / r2.getDenominator());
if (d1 > d2)
if (d1 > d3)
return new Rational(numerator,denominator);
else
return new Rational(r2.getNumerator(),r2.getDenominator());
else
if (d2 > d3)
return new Rational(r1.getNumerator(),r1.getDenominator());
else
return new Rational(r2.getNumerator(),r2.getDenominator());
}
//Method to compare rational numbers and return the smaller rational
public Rational getMinimum(Rational r1, Rational r2,Rational r3)
{
float d1, d2, d3;
d3 = (r3.getNumerator() / r3.getDenominator());
d1 = (r1.getNumerator() / r1.getDenominator());
d2 = (r2.getNumerator() / r2.getDenominator());
if (d1 < d2)
if (d1 < d3)
return new Rational(r1.getNumerator(),r1.getDenominator());
else
return new Rational(r3.getNumerator(),r3.getDenominator());
else
if (d2 < d3)
return new Rational(r2.getNumerator(),r2.getDenominator());
else
return new Rational(r3.getNumerator(),r3.getDenominator());
}
以下是它们在主程序中的使用位置...
//Compares the float point formats to find the maximum number
MaxNum = RatOne.getMaximum(RatTwo,RatThree);
//Prints the maximum number in rational and float format
System.out.println("Maximum: " + MaxNum + " ("
+ MaxNum.getFloat(MaxNum.getNumerator(),MaxNum.getDenominator())
+ ")");
//Compares the float point formats to find the minumum number
MinNum = RatThree.getMinimum(RatOne,RatTwo,RatThree);
//Prints the minimum number in rational and float format
System.out.println("Minimum: " + MinNum + " ("
+ MinNum.getFloat(MinNum.getNumerator(),MinNum.getDenominator())
+ ")");
我有一种感觉,问题可能出在调用方法时使用的对象上,但我不知道还有哪些其他对象是合适的。任何帮助将不胜感激!
我怀疑的一个问题是你的 Rational 类是这样实现的:
public class Rational {
int numerator;
int denominator;
..
int getNumerator() { .. }
int getDenominator() { .. }
}
回想一下,对两个整数(例如:getNumerator() / getDenominator()
)执行除法将摆脱任何余数。
举个例子,下面的代码将产生 3.0 而不是 3.3333...
int x = 10;
int y = 3;
float f = x / y;
System.out.println(f);
实现这一点的更好方法是:
(float)x / y