具有特定标志的System.out.printf未返回预期的数字

时间:2013-05-12 19:30:44

标签: java string formatting flags floating-point-precision

我刚刚开始使用Java。我遇到了这个问题:

这是我的代码:

import java.util.Scanner;
public class FormatageValeurNumerique {

    /**
     * @param args
     */
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        System.out.println("Entrez une valeur reelle :");
        Scanner in = new Scanner(System.in);
        float x = in.nextFloat();
//      System.out.printf("La valeur reelle est, apres formatage : %.5+,f", x);
//      Gives exception ? Why ?
//      System.out.printf("La valeur reelle est, apres formatage : %+.5,f", x);
//      Gives exception ? Why ?
        System.out.printf("La valeur reelle est, apres formatage : %+,.5f", x);
    }
}

输出:

Entrez une valeur reelle: 315136.23 La valeur reelle est,apres formatage: +315,136.21875

这就是预期的结果:

Formatage devaleursnumériques

Écrivezunprogram quidemandeàl'usagerunevaleurréelleetqui l'afficheàl'écranens'assurant d'avoir au moins 5chiffresprèslavirgule,enforçantl'apparitiondu signe et en incluant le groupement de chiffres。

L'affichage obtenudoitêtresemblableau suivant:

Entrez unevaleurréelle: 315136.23 Lavaleurréelleest,après格式: +315,136.23000

数字不匹配......有什么想法?

另外,如果有人可以解释为什么我会得到例外,这取决于我如何写出标志?是否优先尊重?

1 个答案:

答案 0 :(得分:1)

除非在特定情况下,否则不要使用浮动。这与printf无关,而与使用float作为浮点类型时丢失精度这一事实有关。使用double,其精度为float或BigDecimal的两倍,具有您定义的精度。

我认为我使用浮点数的唯一一次是调用Java核心类方法时需要浮点参数,例如一些Swing常量以及设置Swing Font的大小。使用double的额外开销很小。此外,您不应该使用float或double进行财务计算,因为这些需要浮点类型不提供的极高精度。使用BigDecimal。

有关差异的更多信息,请参阅:different-values-for-float-and-double。但主要记得Java float在内部表示为32位表示,而double则表示为64位表示。