2

我正在尝试在我的代码中输入 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]);    
4

5 回答 5

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;
}

对于真正的应用程序,您可能需要一些额外的错误检查。

于 2013-10-07T20:10:23.933 回答
1

Double.parseDouble方法根本不理解分数。它不知道该怎么办1 5/8;它需要类似的东西1.625

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

Double.valueOf方法,它也解析Strings(它只是创建 aDouble而不是 a double)去指定什么是允许的并且不会抛出 a NumberFormatException

于 2013-10-07T20:12:45.607 回答
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
于 2013-10-07T20:50:16.487 回答
0

你不能在 Java 或大多数其他语言中做分数。试试这门课

于 2013-10-07T20:09:15.193 回答
0

我会推荐正则表达式来解析输入。

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

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”
于 2013-10-07T21:31:57.853 回答