Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/353.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中有意义地比较两个字符串_Java_String_Numbers_Double_Long Integer - Fatal编程技术网

在Java中有意义地比较两个字符串

在Java中有意义地比较两个字符串,java,string,numbers,double,long-integer,Java,String,Numbers,Double,Long Integer,我有两个字符串需要比较,但我想有意义地比较它们,这样当它们是数字时,应该比较它们的实际值。到目前为止,我已经尝试了以下解决方案: String str1 = "-0.6"; String str2 = "-.6"; if (NumberUtils.isNumber(str1) && NumberUtils.isNumber(str2)) { Number num1 = NumberUtils.createNumber(str1); Number num2 = Nu

我有两个字符串需要比较,但我想有意义地比较它们,这样当它们是数字时,应该比较它们的实际值。到目前为止,我已经尝试了以下解决方案:

String str1 = "-0.6";
String str2 = "-.6";
if (NumberUtils.isNumber(str1) && NumberUtils.isNumber(str2)) {
    Number num1 = NumberUtils.createNumber(str1);
    Number num2 = NumberUtils.createNumber(str2);
    System.out.println(num1.equals(num2));
} else {
    System.out.println(str1.equals(str2));
}
这是因为两者都转换为
double
s.
但在以下情况下,这将不起作用:

String str1 = "6";
String str2 = "6.0";

有什么简单的方法可以做到这一点,或者我必须编写自己的比较器吗?

您可以使用
BigDecimal
来实现这一点:

final BigDecimal b1 = new BigDecimal(str1);
final BigDecimal b2 = new BigDecimal(str2);
return b1.compareTo(b2) == 0;

不要使用通用型,而是使用以下方法强制他们加倍:


您可以使用
Double.parseDouble(字符串)
。它抛出
NumberFormatException
,可以捕获该异常以通知您不应将它们作为数字进行比较

try {
    Double d1 = Double.parseDouble(str1);
    Double d2 = Double.parseDouble(str2);

    //Now you have your doubles
} catch (NumberFormatException e)
{
    //Could not compare as numbers, do something else
}

正如注释中所建议的,一个字符串可以是
数字
,另一个则不是,反之亦然,或者两者都可以是
字符串
,因此我将使用
try catch
块,而不是检查字符串是否是数字字符串

像这样:

try{
    Double d1 = Double.parseDouble(str1);
    Double d2 = Double.parseDouble(str2);
    System.out.println(d1.equals(d2));
}catch(NumberFormatException ex){

    System.out.println(num1.equals(num2));

}


这首先尝试将它们作为数字进行比较,但如果其中至少有一个不是数字字符串,它将返回到
catch
块中的字符串比较。

当一个字符串不是某种数字时,您如何操作?您不能进行
createNumber()吗
方法始终为数字返回
Double
?这意味着字符串不适用于这样的数字比较。您应该使用converting来加倍并比较它们,正如您所提到的。它是否使用类似于
Number num1=0的方法来解决问题numberrutils.createNumber(str1)?对于
num2
,情况也是如此。为什么代码段中提到的较小的数字会有大的十进制数?如果字符串中的一个不是数字,会发生什么情况?@DegenSharew我在文章中提到了第一件事comments@sakthisundar因为精确;至少,使用
BigDecimal
你不会得到任何惊喜!
try{
    Double d1 = Double.parseDouble(str1);
    Double d2 = Double.parseDouble(str2);
    System.out.println(d1.equals(d2));
}catch(NumberFormatException ex){

    System.out.println(num1.equals(num2));

}