我使用Choco
约束求解器来解决问题
我使用RealVariable
s x
,y
和z
解决方案看起来像这样
x[3.9999999999999996, 4.000000000000001]
y[-3.1434555694057773E-162, 3.1434555694057773E-162]
z[-3.1434555694057773E-162, 3.1434555694057773E-162]
我尝试将解决方案解析为双变量。
这是我的代码:
String X = s.getVar(x).toString();
String Y = s.getVar(y).toString();
String Z = s.getVar(z).toString();
Matcher match = Pattern.compile("-?\\d+(\\.\\d+)?").matcher(X);
while(match.find())
{
double d = Double.parseDouble(match.group());
System.out.println("value= " + d);
}
match = Pattern.compile("-?\\d+(\\.\\d+)?").matcher(Y);
while(match.find())
{
DecimalFormat format = new DecimalFormat("0.00");
Double d = Double.parseDouble(match.group());
System.out.println("value= " + format.format(d));
}
match = Pattern.compile("-?\\d+(\\.\\d+)?").matcher(Z);
while(match.find())
{
double d = Double.parseDouble(match.group());
System.out.println("parsed: " + d);
}
输出结果为:
parsed: 3.9999999999999996
parsed: 4.000000000000001
parsed: -3,14
parsed: -162,00
parsed: 3,14
parsed: -162,00
parsed: -3.143455569405777
parsed: -162.0
parsed: 3.143455569405777
parsed: -162.0
这意味着,-162
被解析为另一个双倍。我该如何防止这种情况?如何使用科学记数法解析String
到Double
?
是否会发生这种情况,因为E-162
对于Double
来说太长了?
答案 0 :(得分:3)
Double#parseDouble
解析来自double
s 的String
和,它也会解析指数。
System.out.println(Double.parseDouble("1.2345e5"));
- > 123450.0
答案 1 :(得分:3)
您需要更改模式以考虑指数:
Matcher match = Pattern.compile("-?\\d+(\\.\\d+)?(E-?\\d+)?").matcher(X);
注意:此处不需要捕获组,您可以将其替换为非捕获组(?:...)
。 的
由于您将多次使用相同的正则表达式,因此最好一次性定义模式,而不是重复Pattern.compile("-?\\d+(\\.\\d+)?(E-?\\d+)?")
。你可以用这个:
static Pattern pattern = Pattern.compile("-?\\d+(?:\\.\\d+)?(?:E-?\\d+)?");
....
Matcher match = pattern.matcher(X);
....
match = pattern.matcher(Y);
....
match = pattern.matcher(Z);
答案 2 :(得分:0)
要使用正则表达式从Java中捕获所有数字,请使用此模式
"-?\\d+(\\.\\d+)?(E-?\\d+)?(E\\+?\\d+)?(E?\\d+)?(e-?\\d+)?(e\\+?\\d+)?(e?\\d+)?"
我已经在以下字符串上尝试过此正则表达式,并且所有字符串都返回了true
"2546546516",
"-2546546516",
"2546546516.1241546",
"-2546546516.415441",
"2.5465E+09",
"-2.5465E+09",
"2.5465E-09",
"-2.5465E-09",
"2.5465e+09",
"-2.5465e+09",
"2.5465e-09",
"-2.5465e-09",
"445.4e2",
"-445.4e2"
注意:此答案是由卡西米尔的答案启发
PS。欢迎修改