将混合分数输入java

时间:2013-10-07 20:04:25

标签: java joptionpane

我想在我的代码中输入1 5/8,但不断收到以下错误:

运行:

Exception in thread "main" java.lang.NumberFormatException: For input string: "1 5/8"
at sun.misc.FloatingDecimal.readJavaFormatString(FloatingDecimal.java:1241)
at java.lang.Double.parseDouble(Double.java:540)
at ClientCode.main(ClientCode.java:42)

Java Result: 1
BUILD SUCCESSFUL (total time: 17 seconds)

这是我的代码:

[code] public double findFrac(int whole, String frac) {
  if (frac == null || frac.equals(""))
    return whole;
String[] parts = frac.split("/");
return whole + Integer.parseInt(parts[0]) / (double)Integer.parseInt(parts[0]);    

5 个答案:

答案 0 :(得分:1)

Java编号解析例程不识别“1 5/8”之类的混合数字,甚至不识别“5/8”之类的分数。您需要实现自己评估这些字符串的逻辑。一种方法是分离您的混合数字(通过在空格字符上拆分字符串),分别评估每个部分,然后添加结果。当您评估“5/8”部分时,您需要拆分“/”,评估前导和尾随部分,并进行浮动或双重划分。

例如:

String data = "1 5/8";
String[] parts = data.split(" ");
float value = Integer.parseInt(parts[0]);
if (parts.length > 1) {
    // has fractional part
    parts = parts[1].split("/");
    float numerator = Integer.parseInt(parts[0]);
    float denominator = Integer.parseInt(parts[1]);
    value += numerator / denominator;
}
// value contains 1.625

这与实用方法相同:

public static float evaluateMixedFraction(String data)
    throws NumberFormatException
{
    String[] parts = data.split(" ");
    float value = Integer.parseInt(parts[0]);
    if (parts.length > 1) {
        // has fractional part
        parts = parts[1].split("/");
        float numerator = Integer.parseInt(parts[0]);
        float denominator = Integer.parseInt(parts[1]);
        value += numerator / denominator;
    }
    return value;
}

对于实际应用程序,您可能需要进行一些额外的错误检查。

答案 1 :(得分:1)

Double.parseDouble方法根本不理解分数。它不知道如何处理1 5/8;它需要1.625

之类的东西

要解析分数,您必须自己解析它,或者某些某些库可能执行此任务。

Double.valueOf method,它也解析Strings(它只是创建一个Double而不是double)会长度来指定允许的内容并且不会抛出NumberFormatException

答案 2 :(得分:0)

你不能在java或大多数其他语言中做分数。请改为this class

答案 3 :(得分:0)

对于这个问题,您只需要处理字符串。如果输入正确,则至少有一部分,最多三部分。这些部分仅由空格和斜线分隔,因此您可以使用正则表达式将它们分开。例如:

public class Main {
    public static void main(String[] args) {
        System.out.println(parseFraction("1 4/2"));
        System.out.println(parseFraction("6/2"));
        System.out.println(parseFraction("3"));
    }

    public static double parseFraction(String input) {
        String[] array = input.split("[ /]");
        switch (array.length) {
        case 1: // e.g. "1"
            return Double.parseDouble(array[0]);
        case 2: // e.g. "1/2"
            return Double.parseDouble(array[0]) / Double.parseDouble(array[1]);
        case 3: // e.g. "1 2/3"
            return Double.parseDouble(array[0]) + 
                    Double.parseDouble(array[1]) / Double.parseDouble(array[2]);
        default:
            throw new IllegalArgumentException("Wrong input!");
        }
    }
}

输入是等效的,因此输出对于所有情况都是相同的:

3.0
3.0
3.0

答案 4 :(得分:0)

我建议regular expressions来解析输入。

以下是如何解析分数的示例:

static final String numberPatern="[-+]?[0-9]*\\.?[0-9]+([eE][-+]?[0-9]+)?";
static final Pattern pWhole = Pattern.compile("^("+numberPatern+")([\\s\\+-]|$)");
static final Pattern pFrac = Pattern.compile("("+numberPatern+")/("+numberPatern+")$");

static double fracToDouble(String in) {

    Matcher mWhole = pWhole.matcher(in);
    Matcher mFrac = pFrac.matcher(in);
    double d = 0;
    if (mWhole.find()) {
        String whole = mWhole.group(1);
        d += Double.valueOf(whole);
    }
    if (mFrac.find()) {
        String num = mFrac.group(1);
        String den = mFrac.group(3);
        d += Double.valueOf(num) / Double.valueOf(den);
    }
    return d;
}

如果将任何组件指定为有效的java浮点值,它将正确返回1.625一个和五个八个:

  • “1 5/8”
  • “1 + 5/8”
  • “1e0 -500e-2 / -0.00080e4”