大十进制的意外输出 class、java
unexpected output in big decimal class, java
import java.math.BigDecimal;
import java.util.Scanner;
public class bigd {
public static void main(String[]args) {
Scanner s=new Scanner(System.in);
int count=s.nextInt();
// take n inputs and put them in array
String [] number=new String [count] ;
for(int i=0; i<number.length; i++) {
number[i]=s.next();
}// end transfer forr
BigDecimal [] big=new BigDecimal[count];
for(int i=0;i<number.length; i++) {
big[i]= new BigDecimal(number[i]);
}// big loop
//sorting
for(int i=0; i<big.length; i++) {
for(int j=i+1; j<big.length; j++) {
if(big[i].compareTo(big[j])<0) {
BigDecimal temp=big[i];
big[i]=big[j];
big[j]=temp;
}// if end
}// inner loop
} // outer sort loop
//end soting
//display
for(int i=0; i<big.length;i++) {
System.out.println(" "+ big[i]);
}//end disp
s.close();
}// main
}// class
这里的问题是,当我对提供的输入进行排序时,它会在 .12
等数字前面添加一个零,因此它将输出带有所述 0 的数字,如 0.12
。
如何输出相同的数字.12
?
我需要知道为什么要添加零。
System.out.println(" "+ big[i])
调用 BigDecimal 的 toString()
方法,这就是它的实现方式,这是有道理的,因为数字通常是这样写的。
您可以对 toString()
的结果添加字符串操作,但我不确定您为什么要这样做。
你不把零放在那里的动机是什么?
你可以用decimalFormat去掉前面的0。
BigDecimal d = new BigDecimal(".21");
DecimalFormat df = new DecimalFormat("#.00");
System.out.print(df.format(d).toString());
最简单的解决方案可能是对 BigDecimal.toString()
生成的标准格式进行一些字符串操作,如
BigDecimal bd = new BigDecimal(".12");
System.out.println(bd.toString().replaceFirst("^0\.", "."));
输出:.12
如果您想查看使用 DecimalFormat
,这应该适用于您给出的示例输入:
BigDecimal big = new BigDecimal(".12");
DecimalFormat df = new DecimalFormat(".##");
System.out.println(df.format(big));
输出:.12
但请注意,这将打印最多 2 个小数位。您可以将其增加到您希望在小数部分中看到的任意数字。
但是,如果您想确保看到 BigDecimal
中的 所有 小数位,您可以这样做:
BigDecimal big = new BigDecimal(".123456789");
DecimalFormat df = new DecimalFormat(".");
df.setMaximumFractionDigits(big.scale());
System.out.println(df.format(big));
输出:.123456789
import java.math.BigDecimal;
import java.util.Scanner;
public class bigd {
public static void main(String[]args) {
Scanner s=new Scanner(System.in);
int count=s.nextInt();
// take n inputs and put them in array
String [] number=new String [count] ;
for(int i=0; i<number.length; i++) {
number[i]=s.next();
}// end transfer forr
BigDecimal [] big=new BigDecimal[count];
for(int i=0;i<number.length; i++) {
big[i]= new BigDecimal(number[i]);
}// big loop
//sorting
for(int i=0; i<big.length; i++) {
for(int j=i+1; j<big.length; j++) {
if(big[i].compareTo(big[j])<0) {
BigDecimal temp=big[i];
big[i]=big[j];
big[j]=temp;
}// if end
}// inner loop
} // outer sort loop
//end soting
//display
for(int i=0; i<big.length;i++) {
System.out.println(" "+ big[i]);
}//end disp
s.close();
}// main
}// class
这里的问题是,当我对提供的输入进行排序时,它会在 .12
等数字前面添加一个零,因此它将输出带有所述 0 的数字,如 0.12
。
如何输出相同的数字.12
?
我需要知道为什么要添加零。
System.out.println(" "+ big[i])
调用 BigDecimal 的 toString()
方法,这就是它的实现方式,这是有道理的,因为数字通常是这样写的。
您可以对 toString()
的结果添加字符串操作,但我不确定您为什么要这样做。
你不把零放在那里的动机是什么?
你可以用decimalFormat去掉前面的0。
BigDecimal d = new BigDecimal(".21");
DecimalFormat df = new DecimalFormat("#.00");
System.out.print(df.format(d).toString());
最简单的解决方案可能是对 BigDecimal.toString()
生成的标准格式进行一些字符串操作,如
BigDecimal bd = new BigDecimal(".12");
System.out.println(bd.toString().replaceFirst("^0\.", "."));
输出:.12
如果您想查看使用 DecimalFormat
,这应该适用于您给出的示例输入:
BigDecimal big = new BigDecimal(".12");
DecimalFormat df = new DecimalFormat(".##");
System.out.println(df.format(big));
输出:.12
但请注意,这将打印最多 2 个小数位。您可以将其增加到您希望在小数部分中看到的任意数字。
但是,如果您想确保看到 BigDecimal
中的 所有 小数位,您可以这样做:
BigDecimal big = new BigDecimal(".123456789");
DecimalFormat df = new DecimalFormat(".");
df.setMaximumFractionDigits(big.scale());
System.out.println(df.format(big));
输出:.123456789