无法格式化双精度,以便在小数分隔符后打印2位数

时间:2016-02-23 10:25:25

标签: java arrays format printf

我正在尝试格式化double,以便它只在小数分隔符后面打印2位数。我的所有变量都是双倍的,而奇怪的是它格式化using System; using System.Collections.Generic; //using System.Linq; using System.Text; using System.Runtime.InteropServices; namespace ExtraPuttyDLL_Test { class Program { [DllImport("C:\\Users\\xroeseners\\Desktop\\ExtraPuTTY-0-29\\ExtraPuTTY.dll", EntryPoint = "Connexion")] static extern int OpenConnection( string TargetName, ref UInt32 ConnectionId, string Login, string Password, byte ShowTerminal, Int32 Protocol, UInt32 PortNumber, Int32 Report, CallbackRcvData Callback, UInt32 SpecSettings); [DllImport("C:\\Users\\xroeseners\\Desktop\\ExtraPuTTY-0-29\\ExtraPuTTY.dll", EntryPoint = "SendRcvData")] static extern int SendData( UInt32 ConnectionId, string Data, string Title, string Comments, Int32 TimeCapture, char[] Buf, Int32 MaxSizeData, UInt32 settings); // int SendRcvData(unsigned long ConnectionId,char *Command,char *Title,char *Comments,long TimeCapture,char **DataRcv,long MaxSizeofData,unsigned long settings); // Settings Bit fields of settings (2^0 : CRLF (0 send,1 not send),2^1 : Virtual key codes (0 no virtual key codes in command,1 yes)...reserved) // See FAQ page for a description of all virtual keys codes. [DllImport("C:\\Users\\xroeseners\\Desktop\\ExtraPuTTY-0-29\\ExtraPuTTY.dll", EntryPoint = "CloseConnexion")] static extern int CloseSession(UInt32 ConnectionId); public static UInt32 myConnectionId; public delegate int CallbackRcvData(UInt32 ConnectionId, IntPtr Data, Int32 size, Int32 Status); public static string myString; static void Main(string[] args) { myConnectionId = new UInt32(); int size, status; char[] data = null; CallbackRcvData Callback = new CallbackRcvData(RcvData); //CallbackRcvData = new CallbackRcvData(myConnectionId, OpenConnection("192.168.8.98", ref myConnectionId, "admin", // user "admin", // password 0, // no display of putty terminal 1, // SSH Protocol 22, // Port 0, // Generate Report: 0 = nein Callback, 0); // bin_000 -> dont wait login prompt, dynamically starting putty log, ssh v1 otherwise ssh v2 SendData(myConnectionId, "uname -r", "", "", 5000, data, 20000, 0); CloseSession(myConnectionId); } public static int RcvData(UInt32 ConnectionId, IntPtr Data, Int32 size, Int32 Status) { if ((size > 0) && (Status == 0) && (Data != null)) { myString = Marshal.PtrToStringAnsi(Data) ; } return 0; } } } 就好并且不会出错,但是如果我尝试格式化aflossingen[i]interesten[i]就像它只是一样给出了这个错误:

uitstaandeLening[i]

我的代码中也没有String类型变量或任何内容。我只是看不出有什么问题。

这是我的所有代码

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)

3 个答案:

答案 0 :(得分:0)

这是有效的,希望这会有所帮助:

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));
    }

}

答案 1 :(得分:0)

我找到了答案。

String.format需要Object,而不是double .. 所以你需要一个新的Doutble(双值)"

double d=1.234;
System.out.println( String.format("%.2f", new Double(d)));

答案 2 :(得分:0)

System.out.printf("\nJaar " + i + "\t" + uitstaandeLening[i] + "\t\t" + "%.2f" , interesten[i] + "\t\t" + "%.2f",
                    aflossingen[i]);

让我们仔细看看:

这是您告诉printf格式化的字符串:"\nJaar " + i + "\t" + uitstaandeLening[i] + "\t\t" + "%.2f"

请注意uitstaandeLening完全未格式化,它将被自动装箱并使用默认格式。

这是您的第一个参数:interesten[i] + "\t\t" + "%.2f"

这是非法的,因为您尝试将printf格式化为带有“f”格式化程序的字符串。与字符串串联使整个对象成为字符串。 因此,例如""+someIntegerVar在评估后的类型为String。这就是interesten也将被自动装箱和默认格式化的原因。

最后,第二个参数在模板中没有格式化程序(只有最顶层的字符串将被评估为格式化程序,而不是递归的参数)。

正确的行是:

System.out.printf("\nJaar %d\t %.2f \t\t %.2f \t\t %.2f" , i, uitstaandeLening[i], interesten[i], aflossingen[i]);

模板字符串中的所有格式化程序,然后只是数字参数。当然,你也可以使用字符串或日期参数。

此外,我建议使用BigDecimal。 Double会引入舍入错误,这在使用钱时可能很重要。

此外,您应该避免使用“+”连接字符串。例如,"\t\t" + "%.2f"不是最理想的。这只是一个微调,但通常是一个很好的经验法则。

Oracle还有一个关于数字格式的教程:https://docs.oracle.com/javase/tutorial/java/data/numberformat.html