Округление двойного до 5 десятичных знаков в Java ME - PullRequest
10 голосов
/ 20 сентября 2009

Как округлить двойные до 5 десятичных знаков, не используя DecimalFormat?

Ответы [ 8 ]

14 голосов
/ 20 сентября 2009

Вы можете округлить до пятого знака после запятой, сделав его первым десятичным разрядом, умножив свое число. Затем выполните обычное округление и снова сделайте его пятым десятичным знаком.

Скажем, значение округления равно double с именем x:

double factor = 1e5; // = 1 * 10^5 = 100000.
double result = Math.round(x * factor) / factor;

Если вы хотите округлить до 6 десятичных знаков, пусть factor будет 1e6 и т. Д.

10 голосов
/ 20 сентября 2009

Что бы вы ни делали, если вы получите значение double, оно вряд ли будет точно 5 десятичных знаков. Это просто не то, как работает двоичная арифметика с плавающей точкой. Лучшее, что вы можете сделать, это «двойное значение , ближайшее к исходному значению, округленное до 5 десятичных знаков». Если бы вы распечатали точное значение этого двойного числа, оно все равно могло бы иметь более 5 десятичных знаков.

Если вы действительно хотите получить точные десятичные значения, вы должны использовать BigDecimal.

8 голосов
/ 20 сентября 2009

Умножить на 100000. Добавить 0,5. Обрезать до целого числа. Затем разделите на 100000.

Код:

double original = 17.77777777;
int factor = 100000;
int scaled_and_rounded = (int)(original * factor + 0.5);
double rounded = (double)scaled_and_rounded / factor;
3 голосов
/ 20 сентября 2009

Если вы в порядке с внешними библиотеками, вы можете взглянуть на микрофлот , в частности MicroDouble.toString (double d, int length) .

2 голосов
/ 20 апреля 2010
DecimalFormat roundFormatter = new DecimalFormat("########0.00000");

public Double round(Double d)
    {
        return Double.parseDouble(roundFormatter.format(d));
    }
2 голосов
/ 20 сентября 2009

Попробуйте следующее

double value = Double.valueOf(String.format(Locale.US, "%1$.5f", 5.565858845));

System.out.println(value); // prints 5.56586

value = Double.valueOf(String.format(Locale.US, "%1$.5f", 5.56585258));

System.out.println(value); // prints 5.56585

Или, если вы хотите минимальное количество кода

Использовать статический импорт

import static java.lang.Double.valueOf;
import static java.util.Locale.US;
import static java.lang.String.format;

И

double value = valueOf(format(US, "%1$.5f", 5.56585258));

С уважением,

1 голос
/ 20 сентября 2009
public static double roundNumber(double num, int dec) {
        return Math.round(num*Math.pow(10,dec))/Math.pow(10,dec);
}
0 голосов
/ 05 ноября 2010

Я наткнулся здесь на поиски способа ограничить свое двойное число двумя десятичными знаками, чтобы не обрезать и не округлять его. Math.Truncate дает вам неотъемлемую часть двойного числа и отбрасывает все после десятичной точки, поэтому 10.123456 становится 10 после усечения. Math.Round округляет число до ближайшего целого значения, поэтому 10,65 становится 11, а 10,45 становится 10. Таким образом, обе эти функции не отвечают моим потребностям (мне бы хотелось, чтобы .Net перегрузил обе из них, чтобы разрешить усечение или округление до определенного значения. количество знаков после запятой). Самый простой способ сделать то, что мне было нужно, это:

//First create a random number 
Random rand = new Random();

//Then make it a double by getting the NextDouble (this gives you a value 
//between 0 and 1 so I add 10 to make it a number between 10 and 11
double chn = 10 + rand.NextDouble();

//Now convert this number to string fixed to two decimal places by using the
//Format "F2" in ToString
string strChannel = chn.ToString("F2");

//See the string in Output window
System.Diagnostics.Debug.WriteLine("Channel Added: " + strChannel);

//Now convert the string back to double so you have the double (chn) 
//restricted to two decimal places
chn = double.Parse(strChannel);
...