How to convert decimal to fractions?

前端 未结 10 2183
心在旅途
心在旅途 2020-12-06 06:26

What I need to convert decimal to fractions. It is easy to convert to 10\'s feet.

1.5 => 15/10

This can do via this code:



        
相关标签:
10条回答
  • 2020-12-06 07:05
    static private String convertDecimalToFraction(double x){
        if (x < 0){
            return "-" + convertDecimalToFraction(-x);
        }
        double tolerance = 1.0E-6;
        double h1=1; double h2=0;
        double k1=0; double k2=1;
        double b = x;
        do {
            double a = Math.floor(b);
            double aux = h1; h1 = a*h1+h2; h2 = aux;
            aux = k1; k1 = a*k1+k2; k2 = aux;
            b = 1/(b-a);
        } while (Math.abs(x-h1/k1) > x*tolerance);
    
        return h1+"/"+k1;
    }
    

    I got this answer from here. All I had to do is convert his answer to java.

    0 讨论(0)
  • 2020-12-06 07:05

    Not only for the decimal number 1.5, for all you can use the following steps:

    1. Find Number of decimal digits:

      double d = 1.5050;//Example I used

      double d1 = 1;

      String text = Double.toString(Math.abs(d));

      int integerPlaces = text.indexOf('.');

      int decimalPlaces = text.length() - integerPlaces - 1;

      System.out.println(decimalPlaces);//4

    2. Then convert to integer:

      static int ipower(int base, int exp) {

          int result = 1;
          for (int i = 1; i <= exp; i++) {
              result *= base;           
          }            
          return result;
      }
      

      //using the method

      int i = (int) (d*ipower(10, decimalPlaces));

      int i1 = (int) (d1*ipower(10, decimalPlaces));

      System.out.println("i=" + i + " i1 =" +i1);//i=1505 i1 =1000

    3. Then find highest common factor

      private static int commonFactor(int num, int divisor) {

          if (divisor == 0) {
              return num;
          }
      
          return commonFactor(divisor, num % divisor);
      }
      

    //using common factor

    int commonfactor = commonFactor(i, i1);

    System.out.println(commonfactor);//5

    1. Finally print results:

      System.out.println(i/commonfactor + "/" + i1/commonfactor);//301/200

    Here you can find:

      public static void main(String[] args) {
    
            double d = 1.5050;
            double d1 = 1;
    
            String text = Double.toString(Math.abs(d));
            int integerPlaces = text.indexOf('.');
            int decimalPlaces = text.length() - integerPlaces - 1;
    
            System.out.println(decimalPlaces);
            System.out.println(ipower(10, decimalPlaces));
    
            int i = (int) (d*ipower(10, decimalPlaces));
            int i1 = (int) (d1*ipower(10, decimalPlaces));      
    
            System.out.println("i=" + i + " i1 =" +i1);
    
            int commonfactor = commonFactor(i, i1);
            System.out.println(commonfactor);
    
            System.out.println(i/commonfactor + "/" + i1/commonfactor);
    
    
        }
    
        static int ipower(int base, int exp) {
            int result = 1;
            for (int i = 1; i <= exp; i++) {
                result *= base;           
            }
    
            return result;
        }
    
        private static int commonFactor(int num, int divisor) {
            if (divisor == 0) {
                return num;
            }
            return commonFactor(divisor, num % divisor);
        }
    
    0 讨论(0)
  • 2020-12-06 07:06

    You should find the greatest common divisor of the resulted numbers and divide the numerator and denominator by it.

    Here is one way to do it:

    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);
            int g = gcd(num, denom);
            this.num = num / g;
            this.denom = denom /g;
        }
    
        public Rational(int num, int denom) {
            this.num = num;
            this.denom = denom;
        }
    
        public String toString() {
            return String.valueOf(num) + "/" + String.valueOf(denom);
        }
    
        public static int gcd(int num, int denom) {
              ....
        }
    
        public static void main(String[] args) {
            System.out.println(new Rational(1.5));
        }
    }
    
    0 讨论(0)
  • 2020-12-06 07:06

    Here is a simple algorythme :

    numerato = 1.5
    denominator = 1;
    
    while (!isInterger(numerator*denominator))
    do
        denominator++;
    done
    
    return numerator*denominator + '/' + denominator
    
    
    // => 3/2
    

    You just have to implement it in java + implement the isInteger(i) where i is a float.

    0 讨论(0)
  • 2020-12-06 07:10

    I tried adding this as an edit, but it was denied. This answer builds off of @Hristo93's answer but finishes the gcd method:

    public class DecimalToFraction {
    
        private int numerator, denominator;
    
        public Rational(double decimal) {
            String string = String.valueOf(decimal);
            int digitsDec = string.length() - 1 - s.indexOf('.');
            int denominator = 1; 
    
            for (int i = 0; i < digitsDec; i++) {
                decimal *= 10;    
                denominator *= 10;
            }
    
            int numerator = (int) Math.round(decimal);
            int gcd = gcd(numerator, denominator); 
    
            this.numerator = numerator / gcd;
            this.denominator = denominator /gcd;
        }
    
        public static int gcd(int numerator, int denom) {
            return denominator == 0 ? numerator : gcm(denominator, numerator % denominator);
        }
    
        public String toString() {
            return String.valueOf(numerator) + "/" + String.valueOf(denominator);
        }
    
        public static void main(String[] args) {
            System.out.println(new Rational(1.5));
        }
    }
    
    0 讨论(0)
  • 2020-12-06 07:11

    First of all, if you want to convert a decimal number, you need to know the state of the situation before you convert it, let us say you have 0.333333, number 3 is being repeated infinitely. We all know that 0.333333 is 1/3 . Some people think that multiplying by the number of digits after the decimal point will convert it. That is in some cases is false, and the other is true. It is something related to mathematics. Another situation is 0.25, take the numbers after the decimal point and divide them by 100 and simplify them, which equals to 1/4. states have been covered, one more to go, but I am not going to explain it because it is long.

    However, in mathematics we have 3 states for converting a decimal number into a fraction, I am not going to explain them because It will take a lot of space and time, I have already written a program for this problem. This is the code:

    import java.math.BigDecimal;
    import java.math.BigInteger;
    
    public class Main {
        static BigDecimal finalResult = new BigDecimal("0");
        
        static boolean check(short[] checks) {
            boolean isContinues = true;
            int index = -1;
            for (short ind : checks) {
                index++;
                if (ind==1) {
                    
                }
                else if (ind==0) {
                    isContinues = false;
                    break;
                }
                else if (ind==-1) {
                    if (index==0) {
                        isContinues = false;
                    }
                    break;
                }
            }
            
            return isContinues;
        }
        static int[] analyzeDecimal() { // will return int[3]
            int[] analysis = new int[3];
            int dot = finalResult.toString().indexOf(".");
            String num = finalResult.toString();
            int state = -1;
            int firstPart = 0; // first part will be compared with each secondPart!
            int secondPart = 0; 
            String part = ""; // without the dot
            int index = 0; // index for every loop!
            int loop = 6;
            int originalLoop = loop;
            int size = 0; // until six!
            int ps = -1;
            short[] checks = new short[] {-1, -1, -1, -1, -1, -1, -1, -1, -1, -1}; // 10 compares for each part!
            // length of checks is 10!
            int continues = -1; // -1 means there is no continues part!
            boolean stop = false;
            while (true) { // while for size!
                if (size!=6) {
                while (true) { // we need to compare a part with a part!
                    // while for loop
                    // 6 loops, every loop will increase the compared part by 1!
                    if (loop!=-1) { // TODO : check every part with the increasing pos
                        firstPart = dot+1+(originalLoop-loop); // changed
                        try {
                            part = num.substring(firstPart, firstPart+(size+1));
                        }
                        catch (StringIndexOutOfBoundsException ex) {
                            break;
                        }
                        int partSize = part.length();
                        int afterDecimal = num.length()-(dot+1);
                        while (index!=checks.length && 
                            firstPart+partSize+index*partSize-(dot+1)<=afterDecimal) { // while for index!
                            secondPart = firstPart+partSize+index*partSize;
                            String comparedPart;
                            try {
                                comparedPart = num.substring(secondPart, secondPart+partSize);
                            }
                            catch (StringIndexOutOfBoundsException ex) {
                                break;
                            }
                            if (part.equals(comparedPart)) {
                                checks[index] = 1;
                            }
                            else {
                                checks[index] = 0;
                            }
                            index++;
                        }
                        index = 0;
                        if (check(checks)) {
                            stop = true;
                            continues = firstPart;
                            ps = partSize;
                        }
                        for (int i = 0 ; i!=10 ; i++) {
                            checks[i] = -1;
                        }
                    }
                    else { // finished!
                        break;
                    }
                    loop--;
                    if (stop) {
                        break;
                    }
                }
                loop = originalLoop;
                size++;
                if (stop) {
                    break;
                }
                }
                else {
                    break;
                }
            }
            if (continues==-1) {
                state = 2;
            }
            else {
                if (dot+1==continues) {
                    state = 1;
                }
                else {
                    state = 0;
                }
            }
            analysis[0] = state;
            analysis[1] = continues;
            analysis[2] = ps;
            
            return analysis;
        }
        static String convertToStandard() {
            // determine the state first : 
            int[] analysis = analyzeDecimal();
            int dot = finalResult.toString().indexOf('.')+1;
            int continues = analysis[1];
            int partSize = analysis[2]; // how many steps after the continues part
            if (analysis[0]==0) { // constant + continues
                String number = finalResult.toString().substring(0, continues+partSize);
                int numOfConst = continues-dot;
                int numOfDecimals = continues+partSize-dot;
                int den = (int)(Math.pow(10, numOfDecimals)-Math.pow(10, numOfConst)); // (10^numOfDecimals)-(10^numOfConst);
                int num;
                int toSubtract = Integer.parseInt(number.substring(0, dot-1)+number.substring(dot, dot+numOfConst));
                if (number.charAt(0)==0) {
                    num = Integer.parseInt(number.substring(dot));
                }
                else {
                    num = Integer.parseInt(number.replace(".", ""));
                }
                num -= toSubtract;
                return simplify(num, den);
            }
            
            else if (analysis[0]==1) { // continues 
                int num, den;
                // we always have  to subtract by only one x!
                String n = finalResult.toString().substring(0, dot+partSize).replace(".", "");
                num = Integer.parseInt(n);
                den = nines(partSize);
                int toSubtract = Integer.parseInt(finalResult.toString().substring(0, dot-1));
                num -= toSubtract;
                return simplify(num, den);
            }
            else if (analysis[0]==2) { // constant
                partSize = finalResult.toString().length()-dot;
                int num = Integer.parseInt(finalResult.toString().replace(".", ""));
                int den = (int)Math.pow(10, partSize);
                return simplify(num, den);
            }
            else {
                System.out.println("[Error] State is not determined!");
            }
            
            return "STATE NOT DETERMINED!";
        }
        static String simplify(int num, int den) {
            BigInteger n1 = new BigInteger(Integer.toString(num));
            BigInteger n2 = new BigInteger(Integer.toString(den));
            BigInteger GCD = n1.gcd(n2);
            String number = Integer.toString(num/GCD.intValue())+"/"+Integer.toString(den/GCD.intValue());
            
            return number;
        }
        static int nines(int n) {
            StringBuilder result = new StringBuilder();
            while (n!=0) {
                n--;
                result.append("9");
            }
            return Integer.parseInt(result.toString());
        }
        public static void main(String[] args) {
            finalResult = new BigDecimal("1.222222");
            System.out.println(convertToStandard());
        }
    }
    

    The program above will give you an optimal result with high precision. All you have to do is change the finalResult variable in the main function.

    0 讨论(0)
提交回复
热议问题