Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/398.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/13.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 Can';t将双精度格式设置为在小数点分隔符后打印两位数字_Java_Arrays_Format_Printf - Fatal编程技术网

Java Can';t将双精度格式设置为在小数点分隔符后打印两位数字

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

我正在尝试格式化double,以便它只在小数分隔符后面打印2位数字。我所有的变量都是双倍的,奇怪的是它的格式是
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[