2012-01-11 5 views
5

Можно создать дубликат:
Round a double to 2 significant figures after decimal pointокругления десятичных точек

Я пытаюсь работать с преобразованием десятичных степеней (23.1248) в степень минут стиля (23 7'29.3"). это то, что я до сих пор:

double a=23.1248; 
    int deg=(int)a;//gives me the degree 
    float b=(float) (a-deg); 
    int min=(int) (b*60);//gives me the minutes 
    double sec= (double) ((c*60)-min);//gives me my seconds 

все работает отлично, но я хотел бы округлить секунды до ближайшей десятой или четвертой. Я посмотрел на десятичное форматирование, но предпочел бы не передавать его в строку. Я также посмотрел на bigdecimal, но не думаю, что это было бы полезно,

+0

Существует круглый метод Js –

+0

Я думал десятичные точки уже были круглые. И минус знаки, плюс знаки и деление были полностью плоскими :) Чтобы «округлить до 100», просто используйте «Math.round()»: http://docs.oracle.com/javase/1.4.2/docs/api /java/lang/Math.html double x = round (y/100.0) * 100.0; – paulsm4

+0

BigDecimal отлично работает, вы можете создать круглую (числовую, десятичную) функцию, подобную той, что содержится в этом ответе. Попытайтесь, я не понимаю, почему это не сработает. http://stackoverflow.com/a/8911683/744859 –

ответ

11

Попробуйте использовать Math.round(double) на номер после его масштабирования, а затем уменьшите его.

double x = 1.234; 
double y = Math.round(x * 100.0)/100.0; // => 1.23 

Вы также можете использовать BigDecimal, если вы хотите получить действительно тяжеловес:

BigDecimal a = new BigDecimal("1.234"); 
BigDecimal b = a.setScale(2, RoundingMode.DOWN); // => BigDecimal("1.23") 
0

Во-первых, для этого есть библиотечные функции, так почему бы просто не использовать их? См. Math.round(). Не нужно изобретать велосипед. Если бы вы хотели, вы могли бы попробовать, что следует. Чтобы закруглить двойное место сотого по:

x = 0.01 * floor(x * 100.0) 

округлить двойное место в десятом по:

x = 0.1 * floor(x * 10.0) 

округлить дважды в 10^к месту:

x = 10^k * floor(x/10^k) 

Реализация на любом языке, включая Java, должна быть простой. Проблема в том, что она не кругла, а усекает, к вашей позиции. Чтобы исправить это, вы можете просто добавить 0.5 * 10^k к вашему номеру до округления. Если вы просто хотите округлить, используйте версии выше и добавьте 10^k до или после вычисления.

+0

Не хотите ли использовать round() вместо floor()? Я ожидаю, что 0,933 округляется до 0,2, если до 1 дп. –

+0

@brainzzy Я обсуждаю, как добиться того же, что и round() и потолка(), используя примитив floor() для чисел base-10. Но, по сути, да, если он хочет округлить до ближайшего (а не всегда вверх или всегда вниз), round() должен работать. – Patrick87

Смежные вопросы