这是 BigDecimal 比较的问题还是预期的输出错误?
import java.math.*;
import java.util.*;
class Solution{
public static void main(String []argh)
{
int res;
String temp = "";
Scanner sc= new Scanner(System.in);
MathContext mc = new MathContext(100, RoundingMode.FLOOR);
int n=sc.nextInt();
String []s=new String[n+2];
for(int i=0;i<n;i++)
{
s[i]=sc.next();
}
for(int i=0;i<n;i++){
for(int j=0;j<n;j++){
res = new BigDecimal(s[i], mc).compareTo(new BigDecimal(s[j], mc));
if(res == 1){
temp = s[i];
s[i] = s[j];
s[j] = temp;
}
}
}
for(int i=0;i<n;i++)
{
System.out.println(s[i]);
}
}
}
Sample Input: 9 -100 50 0 56.6 90 0.12 .12 02.34 000.000
Expected Output: 90 56.6 50 02.34 0.12 .12 0 000.000 -100
My Output: 90 56.6 50 02.34 .12 0.12 0 000.000 -100
最佳答案
那都是因为比较的顺序
您的算法正在向左侧复制更大的值。让我们考虑每次迭代后字符串数组的状态。当 i=0
数组将是:
i=0: -100 50 0 56.6 90 0.12 .12 02.34 000.000
因为 -100
是最小的,所以留在原处。继续:
i=1: 50 -100 0 56.6 90 0.12 .12 02.34 000.000
因为 50
大于 -100
它将被复制到左边。继续:
i=2: 50 0 -100 56.6 90 0.12 .12 02.34 000.000
i=3: 56.6 50 0 -100 90 0.12 .12 02.34 000.000
i=4: 90 56.6 50 0 -100 0.12 .12 02.34 000.000
当 i=5
且 s[5]
为 0.12
时,您感兴趣的事情将发生:
i=5: 90 56.6 50 0.12 0 -100 .12 02.34 000.000
0.12
将比 .12
更早进行比较,并将在 0
之前取代它。现在,当 i=6
时,我们将比较 .12
:
i=6: 90 56.6 50 0.12 .12 0 -100 02.34 000.000
因为 .12
并不比 0.12
大,而且它比 0.12
比较晚它会保留在 0.12
的右侧。
因此,BigDecimal 比较没有问题。它以正确的方式工作。
希望我的解释不会太复杂。
关于java - Java 中的大数比较,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35933171/