ThreadLocalRandom 双 2 十进制
ThreadLocalRandom double 2 decimal
我尝试打印我的 Array Double 只有 2 位小数。但是我在google找不到怎么办。请帮忙?
package com.company;
import java.util.ArrayList;
import java.util.concurrent.ThreadLocalRandom;
public class java_05_16_05_01 {
public static void main(String[] args){
ArrayList<Double> salary=new ArrayList<Double>();
int NumberPersonSurveyed = ThreadLocalRandom.current().nextInt(1, 10+1);
for(int i=0; i<NumberPersonSurveyed; i++){
double salaryPerson = ThreadLocalRandom.current().nextDouble(1000, 10000+1);
salary.add(salaryPerson);
}
System.out.println(salary);
}
}
实际上输出是:
[9803.056390825992,
2753.180103177606,
2602.5359323328644,
3319.2942269101018]
但我预计:
[9803.056,
2753.18,
2602.53,
3319.29]
注意我想使用 Math.random 或类似的 ThreadLocalRandom 实例。
非常感谢!
有两种方法可以做到这一点,我见过的最常见的方法是基于 C 风格 printf
。
System.out.printf("%.2f", sal);
printf
使用由 %
运算符确定的修饰符。这一个指定它应该打印带 2 个小数位的浮点数 (f
) (.2
)。您可以找到运算符列表 here.
我个人更喜欢 C# 风格 MessageFormat
System.out.println(MessageFormat.format("{0,number,0.00}", sal));
MessageFormat
是 DecimalFormat
的后端,后者表示 #
和 0
上下文中的数字,其中 #
表示可能但不是必需的数字,而 0
代表所需的数字。也就是说,如果您将 10
传递到指定格式,它将打印 10.00
.
编辑:
刚刚意识到这是一个ArrayList;您将不得不遍历数组的每个成员并单独打印它们。
boolean USE_PRINTF = false;
System.out.print("[");
for(int i = 0; i < salary.size(); ++i)
{
if(USE_PRINTF) { System.out.printf("%.2f", salary.get(i)); }
else { System.out.print(MessageFormat.format("{0,number,0.00}", salary.get(i))); }
if(i < salary.size() - 1) { System.out.print(", "); }
}
System.out.println("]");
由于您是在模拟工资,因此您可以简单地生成 int
值,以美分为单位,然后除以 100(并转换为双倍)得到结果。
像这样:
double salaryPerson = ThreadLocalRandom.current().nextInt(100 * 1000, 100 * (10000 + 1)) / 100d;
这种方法可以让您摆脱字符串格式问题,如果您希望执行打印以外的额外操作,还可以使用精确值处理数据。
我尝试打印我的 Array Double 只有 2 位小数。但是我在google找不到怎么办。请帮忙?
package com.company;
import java.util.ArrayList;
import java.util.concurrent.ThreadLocalRandom;
public class java_05_16_05_01 {
public static void main(String[] args){
ArrayList<Double> salary=new ArrayList<Double>();
int NumberPersonSurveyed = ThreadLocalRandom.current().nextInt(1, 10+1);
for(int i=0; i<NumberPersonSurveyed; i++){
double salaryPerson = ThreadLocalRandom.current().nextDouble(1000, 10000+1);
salary.add(salaryPerson);
}
System.out.println(salary);
}
}
实际上输出是: [9803.056390825992, 2753.180103177606, 2602.5359323328644, 3319.2942269101018]
但我预计: [9803.056, 2753.18, 2602.53, 3319.29]
注意我想使用 Math.random 或类似的 ThreadLocalRandom 实例。 非常感谢!
有两种方法可以做到这一点,我见过的最常见的方法是基于 C 风格 printf
。
System.out.printf("%.2f", sal);
printf
使用由 %
运算符确定的修饰符。这一个指定它应该打印带 2 个小数位的浮点数 (f
) (.2
)。您可以找到运算符列表 here.
我个人更喜欢 C# 风格 MessageFormat
System.out.println(MessageFormat.format("{0,number,0.00}", sal));
MessageFormat
是 DecimalFormat
的后端,后者表示 #
和 0
上下文中的数字,其中 #
表示可能但不是必需的数字,而 0
代表所需的数字。也就是说,如果您将 10
传递到指定格式,它将打印 10.00
.
编辑:
刚刚意识到这是一个ArrayList;您将不得不遍历数组的每个成员并单独打印它们。
boolean USE_PRINTF = false;
System.out.print("[");
for(int i = 0; i < salary.size(); ++i)
{
if(USE_PRINTF) { System.out.printf("%.2f", salary.get(i)); }
else { System.out.print(MessageFormat.format("{0,number,0.00}", salary.get(i))); }
if(i < salary.size() - 1) { System.out.print(", "); }
}
System.out.println("]");
由于您是在模拟工资,因此您可以简单地生成 int
值,以美分为单位,然后除以 100(并转换为双倍)得到结果。
像这样:
double salaryPerson = ThreadLocalRandom.current().nextInt(100 * 1000, 100 * (10000 + 1)) / 100d;
这种方法可以让您摆脱字符串格式问题,如果您希望执行打印以外的额外操作,还可以使用精确值处理数据。