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));

MessageFormatDecimalFormat 的后端,后者表示 #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;

这种方法可以让您摆脱字符串格式问题,如果您希望执行打印以外的额外操作,还可以使用精确值处理数据。