【问题标题】:how %f works in java%f 如何在 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 中的第一个 % 符号用于格式化。第二个只是模运算符。

标签: java number-formatting


【解决方案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。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-07-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-23
    • 1970-01-01
    • 2018-02-08
    相关资源
    最近更新 更多