【发布时间】:2014-03-14 18:03:16
【问题描述】:
在我详细介绍之前,是的,这是一项家庭作业。不,我不想要答案,只是提示和/或建议尝试这个或那个。
问题由此引入:
创建一个类 ExactNumber,它使用两个名为 left 的长属性 和右(代表左边的数字部分 和小数点右边)。例如,3.75 将 由 new ExactNumber(3, 7500000000000000L) 表示。注意 L 上 告诉 Java 大数的结尾是 long。这翻译 至:3 + 7500000000000000/10000000000000000 = 3.75
这是我的代码:
public class ExactNumber {
private long left;
private long right;
public ExactNumber(long left, long right) {
this.left = left;
this.right = right;
}
public String toString() {
return String.valueOf(doubleValue());
}
public double doubleValue() {
return ((double) left + (double) (right/ 100000000000000L) / 100);
}
public int compareTo (ExactNumber exactNumber) {
if(exactNumber.left < left) {
return 1;
}
else if (exactNumber.left == left) {
if (exactNumber.right < right) {
return 1;
}
else if (exactNumber.right == right) {
return 0;
}
else {
return -1;
}
}
else {
return -1;
}
}
public boolean equal(ExactNumber thisobject) {
if (thisobject instanceof ExactNumber) {
if (thisobject.doubleValue() == this.doubleValue()) {
return true;
}
else {
return false;
}
}
else {
return false;
}
}
public double add(ExactNumber exactNumber) {;
return ((left+exactNumber.left) + (double)((right+exactNumber.right)*1E-16));
}
}
我的问题是,当预期值等于实际值时,测试会出现错误。以下是测试用例(注意:还有更多测试用例,但它们通过了 JUnit 测试):
public class TestExactNumber extends TestCase {
ExactNumber threesevenfive = new ExactNumber(3, 7500000000000000L);
ExactNumber threesevenfive_andalittlebit = new ExactNumber(3, 7500000000000001L);
ExactNumber threesevenfive_dupe = new ExactNumber(3, 7500000000000000L);
ExactNumber ten = new ExactNumber(10, 0);
ExactNumber thirteensevenfive = new ExactNumber(13, 7500000000000000L);
ExactNumber sevenfifty = new ExactNumber(7, 5000000000000000L);
public void test_equals() {
assertFalse(threesevenfive.equals(threesevenfive_andalittlebit));
assertEquals(threesevenfive, threesevenfive_dupe);
}
public void test_add() {
assertEquals(threesevenfive.add(ten), thirteensevenfive);
assertEquals(threesevenfive.add(threesevenfive), sevenfifty);
上面的 assertEquals 在 JUnit 测试中失败,但表示(例如)预期 = 13.75 和实际 = 13.75。
非常感谢任何关于我需要对我的代码做什么的提示或提示。并提前感谢您。
注意事项:
根据我的导师的说法,我不应该使用 doubleValue 方法来实现我的 equals 方法。我知道我的代码中确实有它,但那是在教练给我的提示之前,我只是不确定如何更改它。
我正在使用 eclipse for java 来编写代码。
【问题讨论】:
-
如果您使用的是 Java 7,您可以在大数字中使用下划线以使其更具可读性。例如,
100_000_000_000_000L。