小编典典

Java的两倍至分数

java

所以我想做的是将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现在所在的行中调用该构造函数。我应该怎么做?


阅读 214

收藏
2020-11-01

共1个答案

小编典典

对于问题的第一部分,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)

但这必须是构造函数中的第一行…在这里没有意义(我们必须先进行一些计算)。因此,我不会尝试这样做。

2020-11-01