ThreadLocalRandom двойной 2 десятичных - PullRequest
0 голосов
/ 29 августа 2018

Я пытаюсь напечатать свой массив Array Double только с двумя десятичными знаками. Но я не могу найти в 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]

Примечание. Я хочу использовать экземпляр ThreadLocalRandom из Math.random или аналогичный. Большое спасибо!

Ответы [ 2 ]

0 голосов
/ 29 августа 2018

Поскольку вы имитируете зарплату, вы можете просто сгенерировать int значения, которые будут в центах, а затем разделить на 100 (и преобразовать в двойное число), чтобы получить свой результат. Вот так:

double salaryPerson = ThreadLocalRandom.current().nextInt(100 * 1000, 100 * (10000 + 1)) / 100d;

Такой подход освобождает вас от проблем форматирования строк, а также позволяет обрабатывать ваши данные с точными значениями, если вы хотите выполнять дополнительные операции помимо печати. ​​

0 голосов
/ 29 августа 2018

Есть 2 способа сделать это, самый распространенный способ, который я видел, основан на стиле C printf.

System.out.printf("%.2f", sal);

printf использует модификаторы, определенные операторами %. Этот указывает, что он должен печатать число с плавающей запятой (f) с двумя десятичными знаками (.2). Вы можете найти список операторов здесь .

Лично я предпочитаю стиль C # MessageFormat

System.out.println(MessageFormat.format("{0,number,0.00}", sal));

MessageFormat backends от 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("]");
...