java中%.2f的用法
时间: 2023-10-04 14:14:14 浏览: 183
在Java中,%.2f是用来格式化浮点数的,其中%表示占位符的开始,f表示浮点数类型,.2表示保留2位小数。例如:
```java
double num = 3.1415926;
System.out.printf("%.2f", num);
```
输出结果为:3.14
在这个例子中,%.2f将会把num的值格式化成一个带有2位小数的字符串。在输出时,printf方法将会替换掉%和f之间的内容为格式化后的结果。
相关问题
优化 package com.moreTest.test04; import java.util.Random; public class MyRun04 implements Runnable { public static String[] arr = new String[3]; public MyRun04() { Random r = new Random(); /*arr[0] = String.format("%.2f", r.nextDouble(100)); arr[1] = String.format("%.2f", r.nextDouble(100 - Double.parseDouble(arr[0]))); arr[2] = String.format("%.2f",100 - Double.parseDouble(arr[0])- Double.parseDouble(arr[1]));*/ double a= r.nextInt(1,9999)/100; double b=r.nextInt(1,9999-(int)(a*100))/100.0; double c=100-a-b; arr[0]=String.format("%.2f",a); arr[1]=String.format("%.2f",b); arr[2]=String.format("%.2f",c); } public static int count = 3; @Override public void run() { while (true) { synchronized (MyRun04.class) { if (count == 0) { System.out.println(Thread.currentThread().getName() + "没有抢到"); break; } else { count--; System.out.println(Thread.currentThread().getName() + "抢到了" + arr[count] + "元"); break; } } } } }
这段代码是一个简单的多线程随机抢红包的程序。其中,MyRun04类实现了Runnable接口,代表一个线程的运行逻辑。在MyRun04的构造函数中,使用Random类生成三个随机数,并将其格式化为两位小数。在run方法中,使用synchronized关键字来同步多个线程对count变量的访问,保证count的值只会被一个线程修改。每个线程在抢到红包时,会从arr数组中取出一个元素,并打印出抢到的红包金额。
这段代码的优化主要在于生成随机数的方式。原先的代码使用了String.format方法来保留两位小数,但这种方式比较繁琐,也不够高效。优化后的代码使用了Random类的nextInt方法来生成随机整数,然后再将其转换为随机的小数。这种方式更加简单明了,也更加高效。
另外,原先的代码中使用了一个静态变量count来表示剩余的红包数量,这种方式不够安全,容易出现并发问题。优化后的代码使用了synchronized关键字来同步对count变量的访问,避免了并发问题。
优化这段代码import java.util.Random; public class MyRun04 implements Runnable { public static String[] arr = new String[3]; public MyRun04() { Random r = new Random(); double a= r.nextInt(1,9999)/100; double b=r.nextInt(1,9999-(int)(a*100))/100.0; double c=100-a-b; arr[0]=String.format("%.2f",a); arr[1]=String.format("%.2f",b); arr[2]=String.format("%.2f",c); } public static int count = 3; @Override public void run() { while (true) { synchronized (MyRun04.class) { if (count == 0) { System.out.println(Thread.currentThread().getName() + "没有抢到"); break; } else { count--; System.out.println(Thread.currentThread().getName() + "抢到了" + arr[count] + "元"); break; } } } } }
这段代码已经进行了比较好的优化,但还有一些可以改进的地方。
1. 静态变量count可以改为实例变量,这样更符合面向对象的设计思路。同时,在多线程环境下,需要使用volatile关键字来保证count变量的可见性和原子性。
2. 在run方法中,可以将synchronized关键字加到count变量的修改语句上,这样可以减少锁的范围,提高并发性能。
下面是优化后的代码:
```java
import java.util.Random;
public class MyRun04 implements Runnable {
private static final String[] arr = new String[3];
private volatile int count = 3;
public MyRun04() {
Random r = new Random();
double a = r.nextInt(1, 9999) / 100.0;
double b = r.nextInt(1, 9999 - (int) (a * 100)) / 100.0;
double c = 100 - a - b;
arr[0] = String.format("%.2f", a);
arr[1] = String.format("%.2f", b);
arr[2] = String.format("%.2f", c);
}
@Override
public void run() {
while (true) {
synchronized (this) {
if (count == 0) {
System.out.println(Thread.currentThread().getName() + "没有抢到");
break;
} else {
count--;
System.out.println(Thread.currentThread().getName() + "抢到了" + arr[count] + "元");
break;
}
}
}
}
}
```
优化后的代码中,count变量改为实例变量,并使用volatile关键字修饰,保证了count变量的可见性和原子性。在run方法中,将synchronized关键字加到count变量的修改语句上,减少了锁的范围,提高了并发性能。