我想在我的代码中输入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]);
答案 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一个和五个八个: