我正在观看加州大学伯克利分校关于用Java创建数组的讲座。教授提出以下代码,并声称代码将创建分数,如1 / 6,2 / 6等。(我添加了main(),以便进行测试。)
public class Test {
public static void main(String[] args) {
Fraction[] f = new Fraction[5];
for (int i=0; i<5; i++){
f[i] = new Fraction(i, 6);
}
}
}
我在Eclipse中对此进行测试,显然代码没有编译,因为没有类Fraction,即使我将Fraction更改为代码的两倍仍然不会产生任何分数。
我猜教授打算写这个:
public class Test {
public static void main(String[] args) {
double[] f = new double[5];
for (int i=0; i<5; i++){
f[i] = (i/6);
}
}
}
我的推理是否正确?
来源:https://www.youtube.com/watch?v=wGibp2L5uCc @ 12:25
答案 0 :(得分:5)
首先,请注意,这将从0/6
开始,而不是1/6
。其次,教授很可能指的是一个假设的Fraction
类,它存储精确的分数(即分子和分母为两个int
s); double
无法做到这一点。
现在,如果你想使用双打(它不会存储精确的分数本身,而是它们代表的近似数字),你必须使用双除法(而不是整数除法,正如你目前正在执行的那样):
f[i] = i/6.0;
正如@StephenTG指出的那样,Fraction
类似乎已实施here。
答案 1 :(得分:1)
好吧,如果Fraction
类有一个返回double
或float
的方法,那么它实际上可以很好地构建int
。
然后内部逻辑将负责处理并返回正确的类型。
考虑这个例子:
public static void main(String[] args) {
System.out.println(new Fraction(1, 6).getFraction());
}
static class Fraction {
private float fraction;
public Fraction(int num, int den) {
// TODO check that den != 0, otherwise we're in a world of trouble :D
fraction = (float) num/den;
}
public float getFraction() {
return fraction;
}
}
输出:
0.16666667
答案 2 :(得分:1)
是和否。这样:
f[i] = new Fraction(i, 6);
平均值
存储在f数组的位置i上,此分数对象
f
是Fraction[]
,表示每个索引都包含一个Fraction
类型的对象。您需要创建一个新的(new Ftaction(1,6)
)才能存储1/6
。你对 存储的看法是正确的,你只是没有全面了解如何你代表它。
为了您的课程,我认为Fraction
是由您的老师创建的类型,并且您必须在项目中包含(正如其他人正确建议的那样,您可能正在搜索this课程)
答案 3 :(得分:1)
这里有分数类: http://www.cs.berkeley.edu/~jrs/61bf98/labs/lab2/Fraction.java
我认为这也是你班级的一部分。 您必须下载此文件并将其添加到项目中。
答案 4 :(得分:0)
您需要创建Fraction
类才能创建Fraction
个对象的数组。
根据StephenTG的评论,看起来你需要将Fraction.java
导入eclipse。
(此Fraction.java有一个main
方法用于测试目的。您可以将代码放在该方法中,或者如果要使用自己的main
方法,则需要删除该方法。 )
答案 5 :(得分:0)
您应首先定义 Fraction 类:
public class Fraction
{
int numerator;
int denominator;
public Fraction(){}
/* watch out for a division by zero Exception!
* maybe throw a custom exception here
*/
public Fraction(int n, int d){
numerator = n;
denominator = d;
}
public float getValue(){
return numerator * 1.0f/denominator;
}
}
答案 6 :(得分:0)
如果您的Fraction
类的constructor
带有两个整数值(例如),那么您的第一个代码段才有意义:
class Fraction
{
private int val1, val2;
public Fraction(int val1, int val2)
{
this.val1 = val1;
this.val2 = val2;
}
}
对于问题的第二部分,您的循环将首先return
integer
,然后type-cast
来double
。所以,你的情况下的结果总是为零,即使你知道它不应该。要解决此问题,可以执行以下两行代码中的任何一行。
f[i] = ((i + 0.0)/6);
或
f[i] = (i/6.0);