Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 将字符串解析为双精度,包括科学符号E_Java_Regex_Parsing - Fatal编程技术网

Java 将字符串解析为双精度,包括科学符号E

Java 将字符串解析为双精度,包括科学符号E,java,regex,parsing,Java,Regex,Parsing,我使用Choco约束求解器来解决问题。 我使用RealVariablesx,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(

我使用
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
被解析为另一个double。我如何防止这种情况?如何使用科学符号将
字符串
解析为
Double

发生这种情况是因为
E-162
对于
Double
来说太长了吗?

Double#parseDouble
String
s解析
Double
s并解析exponet

System.out.println(Double.parseDouble(“1.2345e5”)

-->123450.0

示例:

Double#parseDouble
String
s解析
Double
s,并解析exponet

System.out.println(Double.parseDouble(“1.2345e5”)

-->123450.0


示例:

您需要更改模式以考虑指数:

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

您需要更改模式以考虑指数:

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

要从正则表达式捕获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"
注:此答案的灵感来自Casimir的答案


PS.欢迎编辑

使用此模式从正则表达式捕获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"
注:此答案的灵感来自Casimir的答案


PS.欢迎编辑

E
与您的正则表达式不匹配,因此它会在
y
z
上找到4个匹配项。您需要考虑数字可能与正则表达式不匹配,因此它会在
y
z
上找到4个匹配项。您需要考虑可能有
E
的数字。