Android: Как получить только две цифры после запятой в десятичном формате? не хочу обрезать значение
Как получить двойное значение, состоящее только из двух цифр после десятичной точки.
Например, если a = 190253.80846153846, то значение результата должно быть равно a = 190253.80
Попробуйте: у меня есть попытаться с этим:
public static DecimalFormat twoDForm = new DecimalFormat("#0.00");
в коде
a = Double.parseDouble(twoDForm.format(((a))));
Но я получил значение как 190253,81 вместо того, что я хочу 190253.80
Так что я должен изменить для этого?
7 ответов
Потому что Math.round() Возвращает ближайший int к аргументу. Результат округляется до целого числа путем добавления 1/2, взятия минимального значения результата и приведения результата к типу int. использование Math.floor()
пример
public static double roundMyData(double Rval, int numberOfDigitsAfterDecimal) {
double p = (float)Math.pow(10,numberOfDigitsAfterDecimal);
Rval = Rval * p;
double tmp = Math.floor(Rval);
System.out.println("~~~~~~tmp~~~~~"+tmp);
return (double)tmp/p;
}
Полный исходный код
class ZiggyTest2{
public static void main(String[] args) {
double num = 190253.80846153846;
double round = roundMyData(num,2);
System.out.println("Rounded data: " + round);
}
public static double roundMyData(double Rval, int numberOfDigitsAfterDecimal) {
double p = (float)Math.pow(10,numberOfDigitsAfterDecimal);
Rval = Rval * p;
double tmp = Math.floor(Rval);
System.out.println("~~~~~~tmp~~~~~"+tmp);
return (double)tmp/p;
}
}
Попробуй это,
сделать объект BigDecimal
double a = 190253.80846153846;
BigDecimal bd = new BigDecimal(a);
BigDecimal res = bd.setScale(2, RoundingMode.DOWN);
System.out.println("" + res.toPlainString());
Без библиотек:
a = (float) (((int)(a * 100)) / 100.0f);
или для двойного:
a = (double) (((int)(a * 100)) / 100.0);
Я думаю, что это собирается вокруг значения, проверьте это
(float)Math.round(value * 100) / 100
по этой ссылке раунд десятичного числа
или этот пример
Following code works for me.
public static double round(double value, int places) {
//here 2 means 2 places after decimal
long factor = (long) Math.pow(10, 2);
value = value * factor;
long tmp = Math.round(value);
return (double) tmp / factor;
}
Вот еще один способ написать его, который похож на "Шаббир", но я думаю, что его легче читать. Я действительно хотел округлить это; если он показывает.349, я хотел бы увидеть.35 - но если вы не хотите этого, то вы можете использовать Math.floor вместо моего Math.round:
public static double round(double time){
time = Math.round(100*time);
return time /= 100;
}
Вот мой полный код: я работаю над программой, чтобы найти 3 случайных временных интервала в 1 минуту в заданном временном отрезке для исследовательского проекта, над которым я работаю.
import java.lang.*;
import java.util.*;
class time{
public static void main (String[] args){
int time = Integer.parseInt(args[0]);
System.out.println("time is: "+time);
//randomly select one eligible start time among many
//the time must not start at the end, a full min is needed from times given
time = time - 1;
double start1 = Math.random()*time;
System.out.println(start1);
start1 = round(start1);
System.out.println(start1);
}
public static double round(double time){
time = Math.round(100*time);
return time /= 100;
}
}
запустить его с текущим выводом:
[bharthur@unix2 edu]$ java time 12
time is: 12
10.757832858914
10.76
[bharthur@unix2 edu]$ java time 12
time is: 12
0.043720864837211715
0.04
double dValue = 10.12345;
try{
String str = Double.toString(dValue*100);`
str = str.split("[.]")[0];
dValue = Double.parseDouble(str)/100;
} catch (Exception e) {
e.printStackTrace();
}
System.out.println(dValue);
Используйте этот код. Вы можете получить желаемый результат, который вы хотите.