Java 检查字符串值是否等于双精度?

Java 检查字符串值是否等于双精度?,java,variables,performance,Java,Variables,Performance,我有多个字符串可能等于或不等于一个双精度值(例如“444”、“44.4”、“-0.0044”)。我想知道最有效的方法是检查它是否等于双精度。起初,我使用的是try-catch语句,但StackOverflow上的其他帖子说,如果抛出异常,这些语句的性能会很高。以下是我目前掌握的代码: try { double a = Double.parseDouble("444"); return true; } catch (NumberFormatException e) {

我有多个字符串可能等于或不等于一个双精度值(例如“444”、“44.4”、“-0.0044”)。我想知道最有效的方法是检查它是否等于双精度。起初,我使用的是try-catch语句,但StackOverflow上的其他帖子说,如果抛出异常,这些语句的性能会很高。以下是我目前掌握的代码:

try { 
     double a = Double.parseDouble("444");
     return true;
}
catch (NumberFormatException e) {
     return false;
}

Java指定一个正则表达式,可用于验证传递给以下的Javadoc中的
Double.parseDouble
Double.valueOf
的字符串:


Java指定一个正则表达式,可用于验证传递给以下的Javadoc中的
Double.parseDouble
Double.valueOf
的字符串:


过去对这个问题的回答是使用API文档中的模式使用预编译的正则表达式

Pattern redbl=Pattern.compile("[\\x00-\\x20]*[+-]?(((((\\p{Digit}+)(\\.)?((\\p{Digit}+)?)([eE][+-]?(\\p{Digit}+))?)|(\\.((\\p{Digit}+))([eE][+-]?(\\p{Digit}+))?)|(((0[xX](\\p{XDigit}+)(\\.)?)|(0[xX](\\p{XDigit}+)?(\\.)(\\p{XDigit}+)))[pP][+-]?(\\p{Digit}+)))[fFdD]?))[\\x00-\\x20]*");
Boolean isDouble=redbl.matcher("444.123").matches();

过去对这个问题的回答是使用API文档中的模式使用预编译的正则表达式

Pattern redbl=Pattern.compile("[\\x00-\\x20]*[+-]?(((((\\p{Digit}+)(\\.)?((\\p{Digit}+)?)([eE][+-]?(\\p{Digit}+))?)|(\\.((\\p{Digit}+))([eE][+-]?(\\p{Digit}+))?)|(((0[xX](\\p{XDigit}+)(\\.)?)|(0[xX](\\p{XDigit}+)?(\\.)(\\p{XDigit}+)))[pP][+-]?(\\p{Digit}+)))[fFdD]?))[\\x00-\\x20]*");
Boolean isDouble=redbl.matcher("444.123").matches();
如果(如标题所示)您正在测试一个
字符串
是否等于一个特定的
双精度
,最简单、最快的方法是将双精度转换为字符串,然后比较:

if (Double.toString(d).equals(s))
而不是处理解析字符串的异常情况


如果按照代码的建议,您正在测试是否可以解析
字符串
(就像任何
双精度
),那么您现在拥有的代码可能是最好的方法。解析浮点数非常复杂,必须在某个地方完成这项工作——最好让API来完成这项工作。此外,抛出异常也没有那么昂贵

只有当您当前的工作实现被证明太慢而无法忍受时,才寻求性能优化。除非您每秒解析数百个,否则我不会担心。

如果(如标题所示)您正在测试
字符串
是否等于特定的
双精度
,最简单、最快速的方法是将双精度转换为字符串,然后比较:

if (Double.toString(d).equals(s))
而不是处理解析字符串的异常情况


如果按照代码的建议,您正在测试是否可以解析
字符串
(就像任何
双精度
),那么您现在拥有的代码可能是最好的方法。解析浮点数非常复杂,必须在某个地方完成这项工作——最好让API来完成这项工作。此外,抛出异常也没有那么昂贵


只有当您当前的工作实现被证明太慢而无法忍受时,才寻求性能优化。除非您每秒解析数百个这样的语句,否则我不会担心。

您检查过了吗?因为您没有方法,所以不能简单地添加return语句。相反,您可以尝试{d=Double.parseDouble(string);}catch(NumberFormatException ex){//do somethine here}@NikosMargaritis,但他们希望避免在第一个异常中抛出异常place@JavaDevil然后他应该在解析字符串之前在指定的模式上测试字符串。@NikosMargaritis这正是他们想要的答案。。。又不是相同的代码。您检查过了吗?因为您没有方法,所以不能简单地添加返回语句。相反,您可以尝试{d=Double.parseDouble(string);}catch(NumberFormatException ex){//do somethine here}@NikosMargaritis,但他们希望避免在第一个异常中抛出异常place@JavaDevil然后他应该在解析字符串之前在指定的模式上测试字符串。@NikosMargaritis这正是他们想要的答案。。。又不是相同的代码了。谢谢!这帮了大忙!谢谢这帮了大忙!根据我的理解,OP是想看看字符串是否等于任何双精度,而不是它是否等于特定的双精度。(这也让我困惑。)@ruakh-oh。。。我想你是对的。所以他的意思是“可以解析为任意双精度”,通过我的阅读,OP是想看看字符串是否等于任意双精度,而不是它是否等于特定的双精度。(这也让我困惑。)@ruakh-oh。。。我想你是对的。所以他的意思是“可以解析为任何双精度”