java - Java 中的双倍分数

标签 java double fractions

所以我要做的是将 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/

相关文章:

javascript - 在javascript中将 float 转换为近似分数

python - 计算循环小数的周期长度

java - 如何将 float 转换为字节分子和分母表示的最接近的分数?

java - 如何使用 Singleton 类将列表数据从一个 fragment 传递到另一个 fragment ?

java - 为什么java已经有Object了还有Type?

mysql 连接查询双

double - Swift 3 迁移 - 双扩展舍入问题

java - 修改Eclipse编辑器颜色的方法

java - SAX解析数据时前导 "?"

c++ - 我不明白为什么这些数字会以它们在 C++ 中的方式出现