Java Can';t将双精度格式设置为在小数点分隔符后打印两位数字
我正在尝试格式化double,以便它只在小数分隔符后面打印2位数字。我所有的变量都是双倍的,奇怪的是它的格式是Java Can';t将双精度格式设置为在小数点分隔符后打印两位数字,java,arrays,format,printf,Java,Arrays,Format,Printf,我正在尝试格式化double,以便它只在小数分隔符后面打印2位数字。我所有的变量都是双倍的,奇怪的是它的格式是aflosingen[i]很好,并且没有给出错误,但是如果我尝试格式化interesten[i]和uitstandelening[i]的格式,它只会给出这个错误: Exception in thread "main" java.util.IllegalFormatConversionException: f != java.lang.String at java.util.Formatt
aflosingen[i]
很好,并且没有给出错误,但是如果我尝试格式化interesten[i]
和uitstandelening[i]
的格式,它只会给出这个错误:
Exception in thread "main" java.util.IllegalFormatConversionException: f != java.lang.String
at java.util.Formatter$FormatSpecifier.failConversion(Unknown Source)
at java.util.Formatter$FormatSpecifier.printFloat(Unknown Source)
at java.util.Formatter$FormatSpecifier.print(Unknown Source)
at java.util.Formatter.format(Unknown Source)
at java.io.PrintStream.format(Unknown Source)
at java.io.PrintStream.printf(Unknown Source)
我的代码中也没有字符串类型的变量或任何东西。我就是看不出有什么问题
这是我所有的代码
package pe2;
import java.util.Scanner;
public class PE2 {
public static void main(String[] args) {
double beginKapitaal = 0;
double jaarlijkseRente = 0;
double rente = 0;
double afbetalingsDuur = 0;
int aantalJaren = 0;
double annuiteit = 0;
double interest;
double aflossing;
double[] uitstaandeLening;
double[] interesten;
double[] aflossingen;
Scanner input = new Scanner(System.in);
for (int i = 0; i < 5;) {
System.out.println("Wat is het beginkapitaal?");
beginKapitaal = input.nextDouble();
if (beginKapitaal <= 0) {
System.out.println("Het beginkapitaal moet groter zijn dan 0");
} else {
i = 5;
}
}
for (int i = 0; i < 5;) {
System.out.println("Wat is de jaarlijkse rente?");
jaarlijkseRente = input.nextDouble();
if (jaarlijkseRente <= 0) {
System.out.println("De jaarlijkse rente moet groter zijn dan 0");
} else {
i = 5;
}
}
for (int i = 0; i < 5;) {
System.out.println("In hoeveel jaar zal de lening afbetaald worden?");
afbetalingsDuur = input.nextDouble();
aantalJaren = (int) afbetalingsDuur + 1;
if (afbetalingsDuur <= 0) {
System.out.println("De afbetalingsduur moet groter zijn dan 0");
} else {
i = 5;
}
}
rente = jaarlijkseRente / 100;
input.close();
annuiteit = beginKapitaal * (rente / (1 - (1 / Math.pow(rente + 1, afbetalingsDuur))));
System.out.printf("Beginkapitaal: " + "%.2f", beginKapitaal);
System.out.printf("\nIntrest: " + "%.2f", jaarlijkseRente);
System.out.printf("\nAfbetalingsduur in jaren: " + "%.1f", afbetalingsDuur);
System.out.printf("\nAnnuïteit: " + "%.2f", annuiteit);
uitstaandeLening = new double[aantalJaren];
interesten = new double[aantalJaren];
aflossingen = new double[aantalJaren];
//interest = beginKapitaal * rente;
//aflossing = annuiteit - interest;
for (int i = 0; i < aantalJaren; i++) {
uitstaandeLening[i] = beginKapitaal - aflossingen[i];
interesten[i] = beginKapitaal * rente;
aflossingen[i] = annuiteit - interesten[i];
if (i == 0) {
System.out.printf("\n\nJaar" + "\tUitstaande lening" + "\tInteresten" + "\t\tAflossing");
} else if (i == 1) {
System.out.printf("\nJaar " + i + "\t" + uitstaandeLening[i] + "\t\t" + "%.2f" , interesten[i] + "\t\t" + "%.2f",
aflossingen[i]);
beginKapitaal = beginKapitaal - aflossingen[i];
} else {
System.out.printf("\nJaar " + i + "\t" + uitstaandeLening[i] + "\t" + interesten[i] + "\t" + "%.2f",
aflossingen[i]);
beginKapitaal = beginKapitaal - aflossingen[i];
}
}
}
}
包装pe2;
导入java.util.Scanner;
公共级PE2{
公共静态void main(字符串[]args){
双起点平均值=0;
双jaarlijkseRente=0;
双倍租金=0;
双afbetalingsDuur=0;
int-aantalJaren=0;
双年金=0;
双重利益;
双aflossing;
双盲法;
双倍利息;
双[]aflosingen;
扫描仪输入=新扫描仪(System.in);
对于(int i=0;i<5;){
System.out.println(“他是从哪来的?”);
beginKapitaal=input.nextDouble();
如果(beginKapitaal这是有效的,希望这将有助于:
import java.text.DecimalFormat;
public class TestDouble{
private static DecimalFormat df2 = new DecimalFormat(".##");
public static void main(String[] args) {
double input = 32.123456;
System.out.println("double : " + input);
System.out.println("double : " + df2.format(input));
}
}
这是可行的,希望这将有助于:
import java.text.DecimalFormat;
public class TestDouble{
private static DecimalFormat df2 = new DecimalFormat(".##");
public static void main(String[] args) {
double input = 32.123456;
System.out.println("double : " + input);
System.out.println("double : " + df2.format(input));
}
}
我找到了答案
String.format需要对象,而不是双精度。。
所以你需要一个“新的双倍值”
我找到了答案
String.format需要对象,而不是双精度。。
所以你需要一个“新的双倍值”
让我们仔细看看:
这是您告诉printf
要格式化的字符串:“\nJaar”+i+“\t”+uitstaandeleng[i]+“\t\t”+“%.2f”
请注意,uitstaandeLening
是完全未格式化的,它将自动装箱,并使用默认格式
这是您的第一个参数:interesten[i]+“\t\t”+“%.2f”
这是非法的,因为您正试图使用“f”格式设置程序将printf格式设置为字符串。使用字符串连接将使整个对象成为字符串。
因此,例如,“”+someIntegerVar
在计算后为String类型。这就是为什么interesten
也将自动装箱并设置默认格式
最后,第二个参数在模板中没有格式化程序(格式化程序只计算最顶端的字符串,而不是递归地计算参数)
正确的路线是:
System.out.printf("\nJaar %d\t %.2f \t\t %.2f \t\t %.2f" , i, uitstaandeLening[i], interesten[i], aflossingen[i]);
模板字符串中的所有格式化程序,然后是数字参数。当然,您也可以有字符串或日期参数
此外,我建议使用.Double将引入舍入错误,这在处理金钱时可能非常重要
此外,您应该避免使用“+”“\t\t”+“%.2f”
来表示字符串,例如,这是次优的。这只是一个微调,但通常是一个很好的经验法则
Oracle还提供了有关数字格式的教程:
让我们仔细看看:
这是您告诉printf
要格式化的字符串:“\nJaar”+i+“\t”+uitstaandeleng[i]+“\t\t”+“%.2f”
请注意,uitstaandeLening
是完全未格式化的,它将自动装箱,并使用默认格式
这是您的第一个参数:interesten[i]+“\t\t”+“%.2f”
这是非法的,因为您正试图使用“f”格式设置程序将printf格式设置为字符串。使用字符串连接将使整个对象成为字符串。
因此,例如,“”+someIntegerVar
在计算后为String类型。这就是为什么interesten
也将自动装箱并设置默认格式
最后,第二个参数在模板中没有格式化程序(格式化程序只计算最顶端的字符串,而不是递归地计算参数)
正确的路线是:
System.out.printf("\nJaar %d\t %.2f \t\t %.2f \t\t %.2f" , i, uitstaandeLening[i], interesten[i], aflossingen[i]);
模板字符串中的所有格式化程序,然后是数字参数。当然,您也可以有字符串或日期参数
此外,我建议使用.Double将引入舍入错误,这在处理金钱时可能非常重要
此外,您应该避免使用“+”“\t\t”+“%.2f”
来表示字符串,例如,这是次优的。这只是一个微调,但通常是一个很好的经验法则
Oracle还有一个关于数字格式的教程:您正在参数System.out.printf(“\nJaar”+i+“\t”+uitstaandeling[i]+“\t\t”+“%.2f”,interesten[i]+“\t\t”+“%.2f”,aflossingen[i]);
应该是System.out.printf(“\nJaar”+i+“\t”+uitstaandeling[i]+“\t\t”+“%.2f”+“\t\t”+“%.2f”,利息[i],aflosingen[i])
…在其他问题中。这没有格式化:/n那么其他问题是什么?请将预期输出与您获得的输出相加。ui标准化将不会格式化,因为您没有告诉printf这样做。其他问题应该格式化。请尝试:System.out.printf(“\nJaar%d\t%.2f\t\t%.2f\t\t%.2f”“,i,uitstaandeleng[i],interesten[i],aflossingen[i]);
作为旁注:处理货币值时,您可能应该使用BigDecimal而不是double。您可以发布用于生成该输出的代码吗?您正在param.System.out.printf(“\nJaar”+i+“\t”+uitstaandeleng[i]+“\t\t”+“%.2f”中添加一种格式”,interesten[i]+“\t\t”+“%.2f”,aflossingen[i]);
应该是System.out.printf(“\nJaar”+i+“\t”+uitstaandeleng[i]+“\t\t”+“%.2f”+“\t\t”+“%.2f”,interesten[i],aflossingen[i])
…在其他问题中。这没有格式化:/n那么其他问题是什么?请将预期输出与您获得的输出相加。ui标准化将不会格式化,因为您没有告诉printf这样做。其他问题应该格式化。请尝试:System.out.printf(“\nJaar%d\t%.2f\t\t%.2f\t\t%.2f”,i,Uitstaandleing[