Java 计算器混合数

Java 计算器混合数,java,numbers,calculator,fractions,mixed,Java,Numbers,Calculator,Fractions,Mixed,我是一个java初学者,尝试制作一个可以接受混合数字和分数的计算器,但它不是计算数值,而是将两者结合起来。(例1+1/2) 答案是11/2 )`导入java.util.Scanner; 公共类计算器{ public static void main(String[] args) { Scanner Woith = new Scanner(System.in); System.out.println("Welcome to the Calc-O-Lator 9000\nthis calculat

我是一个java初学者,尝试制作一个可以接受混合数字和分数的计算器,但它不是计算数值,而是将两者结合起来。(例1+1/2) 答案是11/2 )`导入java.util.Scanner; 公共类计算器{

public static void main(String[] args) {
Scanner Woith = new Scanner(System.in);

System.out.println("Welcome to the Calc-O-Lator 9000\nthis calculator is able to\nadd, subtract, mulitiple, divide, and handle exponents of\nFRACTIONS\n\nenter 'quit' when done");
System.out.println("To input a mixed number use an underscore in addition with a slash(ex. 2_1/2), also provide a space between the first number and operator\n and the operator and the second number.");
Boolean on=true;
Scanner console=new Scanner(System.in);String firstNumber = Woith.next();
    if (firstNumber.equals("quit")) {
        on = false;
        System.out.println("goodbye");


    } else {
        firstNumber = parseFullNumber(firstNumber);
    }
    String operator = Woith.next();
    if (operator.equals("quit")) {
        on = false;
        System.out.println("goodbye");

    } else if (operator.equals("+") || operator.equals("-") || operator.equals("/") || operator.equals("*")) {
    } else {
        throw new ArithmeticException();
    }

    String secondNumber = Woith.next();
    if (secondNumber.equals("quit")) {
        on = false;
        System.out.println("goodbye");

    } else {
        secondNumber = parseFullNumber(secondNumber);
    }
    int wholeNumber = 0;
    int numerator = 0;
    int denominator = 0;
    System.out.println(calculate(operator ,  firstNumber, secondNumber, wholeNumber, numerator, denominator));
}
public static String parseFullNumber(String input) {
    int wholeNumber = 0;
    int numerator = 0;
    int denominator = 0;
    int underscoreIdx = input.indexOf('_');
    int slashIdx = input.indexOf('/');
    if (underscoreIdx > -1) { 
        wholeNumber = Integer.parseInt(input.substring(0, underscoreIdx));
        numerator = Integer.parseInt(input.substring(underscoreIdx + 1, slashIdx));
        denominator = Integer.parseInt(input.substring(slashIdx + 1, input.length()));
    } else {
        if (slashIdx > -1) {

            numerator = Integer.parseInt(input.substring(0, slashIdx));
            denominator = Integer.parseInt(input.substring(slashIdx + 1, input.length()));
        } else {

            wholeNumber = Integer.parseInt(input);
        }
    }
    return reduce(wholeNumber, numerator, denominator);

}

public static String reduce(int wholeNumber, int numerator, int denominator) {
    int absNumerator = Math.abs(numerator);
    if (absNumerator > 1) {
        int commonFactor = 1;
        for (int i = 2; i < Math.min(absNumerator, denominator); i++) {
            if (numerator % i == 0 && denominator % i == 0) {
                commonFactor = i;
            }
        }
        numerator /= commonFactor;
        denominator /= commonFactor;
    }
    if (absNumerator > denominator) {
        int reduction = numerator / denominator;
        if (wholeNumber >= 0) {
            wholeNumber += reduction;
        } else {
            wholeNumber -= reduction;
        }
        numerator %= denominator;
    }
    if (wholeNumber != 0) {
        if (numerator != 0) {
            return wholeNumber + "_" + numerator + "/" + denominator; 
        } else {
            return String.valueOf(wholeNumber);
        }
    } else {
        if (numerator != 0) {
            return numerator + "/" + denominator;
        } else {
            return String.valueOf(0);
        }
    }
}

public static String calculate(String input, String firstNumber,String secondNumber,int wholeNumber,int numerator,int denominator){
    if (input.contains ("+"))
    {
        if(!input.contains("/")){
            return ("The answer is "+firstNumber + secondNumber);
        }
        if (input.contains("/")){
            return ("The answer is "+(numerator*denominator)+(numerator*denominator)+"/"+(numerator*denominator));
        }
        if(input.contains("_")){
            return ("The answer is "+wholeNumber+numerator+"/"+denominator);
        }
        if(input.contains("-")){
            if(!input.contains("/")){
                return ("The answer is "+firstNumber + secondNumber);
            }
            if (input.contains("/")){
                return ("The answer is "+(numerator*denominator)+"/"+(numerator*denominator));
            }
            if(input.contains("_")){
                return ("The answer is "+wholeNumber+numerator+"/"+denominator);
            }
        if(input.contains("*")){
            if(!input.contains("/")){
                    return ("The answer is "+firstNumber + secondNumber);
                }
            if (input.contains("/")){
                    return ("The answer is "+(numerator*numerator)+"/"+(denominator*denominator));
                }
            if(input.contains("_")){
                    return ("The answer is "+wholeNumber+numerator+"/"+denominator);
                }
            }
        }
    }
    return input;
}
publicstaticvoidmain(字符串[]args){
扫描器Woith=新扫描器(System.in);
System.out.println(“欢迎使用Calc-O-Lator 9000\n此计算器能够\n相加、减法、乘法、除法和处理分数的指数\n\n完成后输入'quit'”);
System.out.println(“要输入一个混合数字,除了使用斜杠(例如2_1/2)外,还要在第一个数字和运算符\n以及运算符和第二个数字之间提供一个空格。”);
布尔开=真;
扫描仪控制台=新扫描仪(System.in);字符串firstNumber=Woith.next();
if(firstNumber.equals(“退出”)){
开=假;
System.out.println(“再见”);
}否则{
firstNumber=parseFullNumber(firstNumber);
}
字符串运算符=Woith.next();
if(运算符等于(“退出”)){
开=假;
System.out.println(“再见”);
}else if(运算符.equals(“+”)|运算符.equals(“-”)|运算符.equals(“/”)|运算符.equals(“*”){
}否则{
抛出新的算术异常();
}
字符串secondNumber=Woith.next();
if(secondNumber.equals(“退出”)){
开=假;
System.out.println(“再见”);
}否则{
secondNumber=parseFullNumber(secondNumber);
}
整数整数=0;
整数分子=0;
int分母=0;
System.out.println(计算(运算符、第一个数字、第二个数字、整数、分子、分母));
}
公共静态字符串parseFullNumber(字符串输入){
整数整数=0;
整数分子=0;
int分母=0;
int下划线EIDX=输入.indexOf(“”“);
int slashIdx=input.indexOf('/');
如果(x>-1){
wholeNumber=Integer.parseInt(input.substring(0,下划线idx));
分子=Integer.parseInt(input.substring(下划线EIDX+1,slashIdx));
分母=Integer.parseInt(input.substring(slashIdx+1,input.length());
}否则{
如果(slashIdx>-1){
分子=整数.parseInt(input.substring(0,slashIdx));
分母=Integer.parseInt(input.substring(slashIdx+1,input.length());
}否则{
wholeNumber=Integer.parseInt(输入);
}
}
返回减缩(整数、分子、分母);
}
公共静态字符串缩减(整数、整数分子、整数分母){
int absNumerator=Math.abs(分子);
如果(分子的绝对值>1){
int公共因子=1;
for(int i=2;i分母){
整数缩减=分子/分母;
如果(整数>=0){
总数量+=减少量;
}否则{
总数量-=减少量;
}
分子%=分母;
}
如果(整数!=0){
if(分子!=0){
返回整数+分子+“/”+分母;
}否则{
返回字符串.valueOf(wholeNumber);
}
}否则{
if(分子!=0){
返回分子+“/”+分母;
}否则{
返回字符串.valueOf(0);
}
}
}
公共静态字符串计算(字符串输入、字符串第一个数字、字符串第二个数字、整数整数、整数分子、整数分母){
if(input.contains(“+”))
{
如果(!input.contains(“/”){
return(“答案是”+firstNumber+secondNumber);
}
if(input.contains(“/”){
返回(“答案是“+(分子*分母)+(分子*分母)+”/“+(分子*分母));
}
if(input.contains(“”)){
返回(“答案是“+整数+分子+”/“+分母”);
}
if(input.contains(“-”){
如果(!input.contains(“/”){
return(“答案是”+firstNumber+secondNumber);
}
if(input.contains(“/”){
返回(“答案是“+(分子*分母)+”/“+(分子*分母));
}
if(input.contains(“”)){
返回(“答案是“+整数+分子+”/“+分母”);
}
if(input.contains(“*”)){
如果(!input.contains(“/”){
return(“答案是”+firstNumber+secondNumber);
}
if(input.contains(“/”){
返回(“答案是“+(分子*分子)+”/“+(分母*分母));
}
if(input.contains(“”)){
返回(“答案是“+整数+分子+”/“+分母”);
}
}
}
}
返回输入;
}

}

好吧,除了代码中的其他问题之外,您的问题“1+1/2答案是11/2”来自这里:

if (input.contains("/")){
    return ("The answer is "+(numerator*denominator)+(numerator*denominator)+"/"+(numerator*denominator));
}
您所述的输出是正确的,因为这是字符串串联。您确实需要浮点转换,请尝试以下方法:

if (input.contains("/")) {
    return ("The answer is "+(numerator*denominator)+((float)(numerator*denominator)/(numerator*denominator)));
}
这是因为您对字符串值使用了“+”运算

e、 g

第一个数字是一种字符串类型,如“1”

第二个数字是一种字符串类型,如“1/2”

在计算方法中,您可以使用以下方式打印答案

如果(!input.contains(“/”){ return(“答案是”+firstNumber+secondNumber); }

此处将返回字符串值“ 答案是11/2“


这就是你所遇到的问题(例如,1+1/2答案是11/2)

请具体说明你的问题。你应该学习一些东西