所以我要做的是将 double 转换为有理数。例如,我检查小数点后有多少位数字,我想将数字 123.456 保存为 123456/1000。
public Rational(double d){
String s = String.valueOf(d);
int digitsDec = s.length() - 1 - s.indexOf('.');
for(int i = 0; i < digitsDec; i++){
d *= 10;
}
System.out.println((int)d); //checking purposes
}
但是,对于数字 123.456,我得到一个舍入错误,结果是 123455。我想可以用 BigDecimal 解决这个问题,但我无法让它工作。另外,在计算出它是什么有理数之后,我想用参数 (int numerator, int denominator) 调用另一个构造函数,但我显然不能在 println 现在所在的行中调用构造函数。我应该怎么做?
最佳答案
对于问题的第一部分,Java 将 .6 存储为 .5999999(重复)。看到这个输出:
(after first multiply): d=1234.56
(after second multiply): d=12345.599999999999
(after third multiply): d=123455.99999999999
一个解决方法是在循环结束后立即使用 d = Math.round(d)。
public class Rational {
private int num, denom;
public Rational(double d) {
String s = String.valueOf(d);
int digitsDec = s.length() - 1 - s.indexOf('.');
int denom = 1;
for(int i = 0; i < digitsDec; i++){
d *= 10;
denom *= 10;
}
int num = (int) Math.round(d);
this.num = num; this.denom = denom;
}
public Rational(int num, int denom) {
this.num = num; this.denom = denom;
}
public String toString() {
return String.valueOf(num) + "/" + String.valueOf(denom);
}
public static void main(String[] args) {
System.out.println(new Rational(123.456));
}
}
它有效 - 试一试。
对于你问题的第二部分......
为了从第一个构造函数调用第二个构造函数,您可以使用“this”关键字
this(num, denom)
但它必须是构造函数中的第一行...这在这里没有意义(我们必须先进行一些计算)。所以我不会费心去尝试那样做。
关于java - Java 中的双倍分数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14014158/