为什么Java不允许在printf中进行自动类型转换?

问题描述 投票:0回答:1
public class Main {
    public static void main(String[] args) {
        System.out.printf("%,.2f", 10000 / 3);
    }
}

此代码将导致运行时错误,如下所示:

Exception in thread "main" java.util.IllegalFormatConversionException: f != java.lang.Integer
    at java.base/java.util.Formatter$FormatSpecifier.failConversion(Formatter.java:4515)
    at java.base/java.util.Formatter$FormatSpecifier.printFloat(Formatter.java:3079)
    at java.base/java.util.Formatter$FormatSpecifier.print(Formatter.java:3027)
    at java.base/java.util.Formatter.format(Formatter.java:2791)
    at java.base/java.io.PrintStream.implFormat(PrintStream.java:1367)
    at java.base/java.io.PrintStream.format(PrintStream.java:1346)
    at java.base/java.io.PrintStream.printf(PrintStream.java:1245)
    at Main.main(Main.java:3)

Java 不允许在

printf
中进行自动类型转换有什么具体原因吗?

我在网上搜索过,但大多数结果只提到 f 格式化程序适用于 float、double 和 BigDecimal,很少解释其背后的原因。

java printf
1个回答
0
投票

首先,如果您希望它会打印 333.333344,我会让您失望:那永远不会发生。

这是因为表达式

1000 / 3
的计算结果为整数
333
,没有与,没有如果,没有但是,句点,故事结束。

现在,您可能想知道为什么它完全拒绝工作,而不是至少自动将整数 333 转换为浮点数并打印 333.000000。

原因是程序员在尝试使用

printf()
时经常会犯错误,因此该函数尝试尽可能类型安全。

类型安全意味着我们永远不会进行任意转换,并且我们要求类型完全匹配,否则我们会发出错误。

© www.soinside.com 2019 - 2024. All rights reserved.