%f 如何在 java 中工作

Posted

技术标签:

【中文标题】%f 如何在 java 中工作【英文标题】:how %f works in java 【发布时间】:2014-08-13 03:49:00 【问题描述】:

我主要在两个不同的场合看到 %f。首先,在printf [我认为] 我知道用法但不知道逻辑:

System.out.printf("%.2f", 3.1415); // will print 2 digits after decimal!

还用于格式化浮点数,例如 nextFloat() 随机生成器,我既不知道其用法也不知道其背后的逻辑:

Random random1 = new Random(100);
float g0 = Math.abs(random1.nextFloat()); // 0.7220096
float g1 = Math.abs(random1.nextFloat() %.1f); // 0.0346627
float g2 = Math.abs(random1.nextFloat() %1f); // 0.19497603
float g3 = Math.abs(random1.nextFloat()) %1f; // 0.7158033

我用谷歌搜索了一些解释,但我不确定我应该搜索哪个类别。 (这是正则表达式还是标志...?) 谁能给我一些例子并解释一下它是如何工作的?

【问题讨论】:

printf 中的第一个 % 符号用于格式化。第二个只是模运算符。 【参考方案1】:

这不是格式问题 - 您正在计算模数!

【讨论】:

【参考方案2】:

random1.nextFloat() %.1f

基本上是使用modulo(remainder) 运算符来随机浮点数。它不用于格式化。

让我们看看float g0 = Math.abs(random1.nextFloat() % .1f); // 0.7220096字节码

      public static void main(java.lang.String[]);
    Code:
       0: new           #16                 // class java/util/Random
       3: dup
       4: ldc2_w        #18                 // long 100l
       7: invokespecial #20                 // Method java/util/Random."<init>":
(J)V
      10: astore_1
      11: aload_1
      12: invokevirtual #23                 // Method java/util/Random.nextFloat
:()F
      15: ldc           #27                 // float 0.1f
      17: frem
      18: invokestatic  #28                 // Method java/lang/Math.abs:(F)F
      21: fstore_2
      22: return

您可以直接看到 0.1f 是浮点数而不是字符串修饰符。

现在System.out.printf("%.2f", 3.1415);

  public static void main(java.lang.String[]);
    Code:
       0: getstatic     #16                 // Field java/lang/System.out:Ljava/
io/PrintStream;
       3: ldc           #22                 // String %.2f
       5: iconst_1
       6: anewarray     #3                  // class java/lang/Object
       9: dup
      10: iconst_0
      11: ldc2_w        #24                 // double 3.1415d
      14: invokestatic  #26                 // Method java/lang/Double.valueOf:(
D)Ljava/lang/Double;
      17: aastore
      18: invokevirtual #32                 // Method java/io/PrintStream.printf
:(Ljava/lang/String;[Ljava/lang/Object;)Ljava/io/PrintStream;
      21: pop
      22: return

现在你可以看到它现在是一个字符串修饰符(// String %.2f)而不是一个浮点类型

【讨论】:

我认为这是在字节码更新之前更清晰的答案(printf 的文档,提到第一个 % 是一个具有特殊格式字符串含义的字符串,并提到第二个% 在表达式中可能是一个更相关的解释),但无论如何 +1。

以上是关于%f 如何在 java 中工作的主要内容,如果未能解决你的问题,请参考以下文章

我如何使这个字符功能在java中工作

面试专题 HashMap如何在Java中工作

如何创建在 Visual Studio Code 中工作的 Java / Maven 项目?

如何使样式中的 Layout_margin 在 Java 中工作

会话如何在 Express.js 和 Node.js 中工作?

关于 sprintf 函数如何在 C 中工作的困惑