Как объединить два-пять десятичных знаков без использования DecimalFormat
?
Округление в два раза до десяти знаков после запятой в Java ME
Ответ 1
Вы можете округлить до пятого десятичного знака, сделав его первым десятичным знаком, умножив свой номер. Затем сделайте нормальное округление и снова сделайте его пятым десятичным разрядом.
Скажем, значение round равно double
с именем x
:
double factor = 1e5; // = 1 * 10^5 = 100000.
double result = Math.round(x * factor) / factor;
Если вы хотите округлить до шести знаков после запятой, пусть factor
be 1e6
и т.д.
Ответ 2
Независимо от того, что вы делаете, если вы получите значение double
, это вряд ли будет ровно 5 знаков после запятой. Это не так, как работает двоичная арифметика с плавающей запятой. Лучшее, что вы сделаете, это "двойное значение, ближайшее к первоначальному значению, округленному до 5 знаков после запятой". Если вы хотите распечатать точное значение этого двойника, оно, вероятно, будет иметь более 5 знаков после запятой.
Если вам действительно нужны точные десятичные значения, вы должны использовать BigDecimal
.
Ответ 3
Умножьте на 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;
Ответ 4
Если у вас все в порядке с внешними библиотеками, вы можете посмотреть microfloat, в частности MicroDouble.toString(double d, int length).
Ответ 5
Попробуйте выполнить
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));
С уважением,
Ответ 6
DecimalFormat roundFormatter = new DecimalFormat("########0.00000");
public Double round(Double d)
{
return Double.parseDouble(roundFormatter.format(d));
}
Ответ 7
public static double roundNumber(double num, int dec) {
return Math.round(num*Math.pow(10,dec))/Math.pow(10,dec);
}
Ответ 8
Я наткнулся на это, пытаясь ограничить свое двойное число двумя десятичными знаками, чтобы не усекать и не округлить его. 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);