我尝试只用2个小数位打印我的Array Double。但我找不到在谷歌怎么办。请帮忙吗?
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实例。 非常感谢!
答案 0 :(得分:0)
执行此操作的方法有2种,最常见的方法是基于C样式printf
。
System.out.printf("%.2f", sal);
printf
使用%
运算符确定的修饰符。该位指定应打印浮点数(f
),该浮点数应带有2个小数位(.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("]");
答案 1 :(得分:0)
由于您正在模拟薪水,因此您可以简单地生成int
值(以美分为单位),然后除以100(并转换为双精度)即可得到结果。
像这样:
double salaryPerson = ThreadLocalRandom.current().nextInt(100 * 1000, 100 * (10000 + 1)) / 100d;
这种方法使您摆脱了字符串格式化问题,并且,如果您希望除了打印之外还执行其他操作,还可以使用精确值来处理数据。