ThreadLocalRandom双2小数

时间:2018-08-29 14:37:55

标签: java decimalformat

我尝试只用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实例。 非常感谢!

2 个答案:

答案 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;

这种方法使您摆脱了字符串格式化问题,并且,如果您希望除了打印之外还执行其他操作,还可以使用精确值来处理数据。