Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Java: Общие вопросы > перевод дробного числа из 4-ричной в 12-ричную


Автор: ArniLand 8.3.2011, 18:18
Написал программу которая переводит дробное число из четырехричной в двенадцатеричную систему счисления, но выдает ошибки. Помогите пожалуйста исправить программу, кто может подправьте пожалуйста код.

Код программы:
Код


package laba12_architecture_drob;
import java.math.BigDecimal;
import java.util.Scanner;
public class Main {
public void fromFourToTwelve() {
        Scanner in = new Scanner(System.in);
        String x;
        x = in.toString(); //введённое число
        char[] mas = x.toCharArray();
        for(int i=0;i<=x.length();i++)
        {
            if(mas[i]!='0' || mas[i]!='1' || mas[i]!='2' || mas[i]!='3' || mas[i]!='.') {System.out.println("Wrong input"); break;}
        }
        double x_dbl = Double.parseDouble(x); //конверт в double
        int cel_ch = (int)x_dbl; // выделение целой части
        String s = Integer.toString(cel_ch); //целая часть в строку
        int r = Integer.parseInt(s, 4); //из 4-ричной в десятичную
        int l = x.length()-s.length()-1; // длинна дробной части (общая - целая - ".")
        double drob_ch = x_dbl-cel_ch; //дробная часть числа
        BigDecimal bd = new BigDecimal(drob_ch);
        bd = bd.setScale(l, BigDecimal.ROUND_HALF_UP);
        drob_ch = bd.doubleValue();
                // Перевод дробной части в десятичную систему счисления
        drob_ch = drob_ch * Math.pow(10, l); //получим только дробную часть. Число после 0.
        int drob = (int)drob_ch;
        double des=0;
        for(int i=l;i>0;i--)
        {
            des += ((drob/Math.pow(10,i))%Math.pow(10,l-i))*Math.pow(3,-(l-i+1)); //определяем след число и умножаем его на 3^-(l-i+1) . Где -(l-i+1) будет -1, -2 и т.д.
        }

        String dr = "";
        int a;
        for(int i=0;i<20;i++)
        {
            drob_ch = drob_ch * 12;//12
            a = (int)(drob_ch);
            drob_ch = drob_ch - a;
        }
        System.out.println(String.valueOf(Integer.toString(r, 12) +  + des));//12
    }
    public static void main(String[] args) {
        Main obj = new Main();
        obj.fromFourToTwelve();
    }

}



Ошибки:
Цитата
Wrong input
Exception in thread "main" java.lang.NumberFormatException: For input string: "java.util.Scanner[delimiters=\p{javaWhitespace}+][position=0][match valid=false][need input=false][source closed=false][skipped=false][group separator=\.][decimal separator=\,][positive prefix=][negative prefix=\Q-\E][positive suffix=][negative suffix=][NaN string=\Q�\E][infinity string=\Q∞\E]"
        at sun.misc.FloatingDecimal.readJavaFormatString(FloatingDecimal.java:1224)
        at java.lang.Double.parseDouble(Double.java:510)
        at laba12_architecture_drob.Main.fromFourToTwelve(Main.java:19)
        at laba12_architecture_drob.Main.main(Main.java:49)
Java Result: 1


Автор: jk1 9.3.2011, 04:28
Код

x = in.toString(); //введённое число


Меняем на 

Код

x = in.nextLine(); //введённое число


Условие заменяем на правильное

Код

 if(mas[i]!='0' && mas[i]!='1' && mas[i]!='2' && mas[i]!='3' && mas[i]!='.')


Циклу выставляем правильную границу

Код

 for(int i=0;i<x.length();i++)


Исправляем вывод результата

Код

String desString =String.valueOf(des).substring(1);
System.out.println(String.valueOf(Integer.toString(r, 12) + desString));//12


В итоге

Код

public class Convert {
public void fromFourToTwelve() {
        Scanner in = new Scanner(System.in);
        String x;
        x = in.nextLine(); //введённое число
        char[] mas = x.toCharArray();
        for(int i=0;i<x.length();i++)
        {
            if(mas[i]!='0' && mas[i]!='1' && mas[i]!='2' && mas[i]!='3' && mas[i]!='.') {System.out.println("Wrong input"); break;}
        }
        double x_dbl = Double.parseDouble(x); //конверт в double
        int cel_ch = (int)x_dbl; // выделение целой части
        String s = Integer.toString(cel_ch); //целая часть в строку
        int r = Integer.parseInt(s, 4); //из 4-ричной в десятичную
        int l = x.length()-s.length()-1; // длинна дробной части (общая - целая - ".")
        double drob_ch = x_dbl-cel_ch; //дробная часть числа
        BigDecimal bd = new BigDecimal(drob_ch);
        bd = bd.setScale(l, BigDecimal.ROUND_HALF_UP);
        drob_ch = bd.doubleValue();
        // Перевод дробной части в десятичную систему счисления
        drob_ch = drob_ch * Math.pow(10, l); //получим только дробную часть. Число после 0.
        int drob = (int)drob_ch;
        double des=0;
        for(int i=l;i>0;i--)
        {
            des += ((drob/Math.pow(10,i))%Math.pow(10,l-i))*Math.pow(3,-(l-i+1)); 
        }
        int a;
        for(int i=0;i<20;i++)
        {
            drob_ch = drob_ch * 12;//12
            a = (int)(drob_ch);
            drob_ch = drob_ch - a;
        }
        String desString =String.valueOf(des).substring(1);
        System.out.println(String.valueOf(Integer.toString(r, 12) + desString));//12
    }
    public static void main(String[] args) {
        Convert obj = new Convert();
        obj.fromFourToTwelve();
    }
}


Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)