簡體   English   中英

將字符串解析為 Double 包括科學記數法 E

[英]Parsing String to Double including scientific notation E

我使用Choco約束求解器來解決問題。
我使用RealVariable s xyz
解決方案看起來像這樣

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被解析為另一個雙-162值。 我如何防止這種情況? 如何使用科學記數法將String解析為Double

這是因為E-162對於Double來說太長了嗎?

Double#parseDoubleString s 解析double s解析 exponet 。

System.out.println(Double.parseDouble("1.2345e5"));

--> 123450.0

示例: https : //ideone.com/ACTVQT

您需要更改您的模式以考慮指數:

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"

注意:這個答案的靈感來自卡西米爾的答案

附注。 歡迎編輯

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM