所以我想做的是将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)
但这必须是构造函数中的第一行…在这里没有意义(我们必须先进行一些计算)。因此,我不会尝试这样做。