2010-04-16 2 views
80

Сейчас я пытаюсь это:Завершают двойной, чтобы превратить его в междунар (Java)

int a = round(n); 

где n является double, но это не работает. Что я делаю не так?

+0

Возможный дубликат http://stackoverflow.com/questions/153724/how-to-round-a-number-to-n-decimal-places-in-java –

+4

Вы должны действительно разработать «нерабочий» в более подробно. Что происходит? Что не происходит? Чего ты ожидал? Какие у вас ошибки? У вас есть метод round() 'в том же классе? Вы импортировали статический файл java.lang.Math. *?? И т. Д. Существует множество способов округления чисел и, следовательно, множество возможных ответов. Другими словами, ваш вопрос является неопределенным и двусмысленным и не может быть разумным ответом в его нынешней форме. Это стреляет в темноте. – BalusC

+1

«Не работает» означает не округление до ближайшего int, а исключение или исключение округления вверх или вниз? Этот вопрос бесполезен, не перекрестно ссылаясь на контекст с ответом. – modulitos

ответ

181

Каков обратный тип метода round() во фрагменте?

Если это метод Math.round(), он возвращает длинный, когда входной параметр равен Double.

Таким образом, вам придется бросить возвращаемое значение:

int a = (int) Math.round(doubleVar); 
+0

Рассмотрите возможность использования Math.toIntExact (long) вместо того, чтобы просто отличать int; двойной может содержать целый ряд значений, и вы, вероятно, не захотите, чтобы вы выбрали наиболее значимые биты, если ваш двойной размер больше, чем вы ожидаете. – othp

3
import java.math.*; 
public class TestRound11 { 
    public static void main(String args[]){ 
    double d = 3.1537; 
    BigDecimal bd = new BigDecimal(d); 
    bd = bd.setScale(2,BigDecimal.ROUND_HALF_UP); 
    // output is 3.15 
    System.out.println(d + " : " + round(d, 2)); 
    // output is 3.154 
    System.out.println(d + " : " + round(d, 3)); 
    } 

    public static double round(double d, int decimalPlace){ 
    // see the Javadoc about why we use a String in the constructor 
    // http://java.sun.com/j2se/1.5.0/docs/api/java/math/BigDecimal.html#BigDecimal(double) 
    BigDecimal bd = new BigDecimal(Double.toString(d)); 
    bd = bd.setScale(decimalPlace,BigDecimal.ROUND_HALF_UP); 
    return bd.doubleValue(); 
    } 
} 
-1

Вам действительно нужно опубликовать более полный пример, чтобы мы могли видеть, что вы пытаетесь сделать. Из того, что вы опубликовали, вот что я вижу. Во-первых, нет встроенного метода round(). Вам нужно либо позвонить Math.round(n), либо статически импортировать Math.round, а затем называть его так, как вы.

+0

В java нет глобальных функций для начала. – Danon

12

ROUNDING двойной к "ближайшей" целое как это:

1,4 ->

1.6 ->

-2,1 ->-2

-1,3 ->-1

-1,5 ->- 2

private int round(double d){ 
    double dAbs = Math.abs(d); 
    int i = (int) dAbs; 
    double result = dAbs - (double) i; 
    if(result<0.5){ 
     return d<0 ? -i : i;    
    }else{ 
     return d<0 ? -(i+1) : i+1;   
    } 
} 

Вы можете изменить условие (результат < 0.5) как пожелаете.

+0

Я согласен с ответом авиваля. Но если вам нужно просто округлить до наивысшего целого числа, вы можете посмотреть ниже: double decimalNumber = 4.56777; System.out.println (новый Float (Math.round (decimalNumber))); Выход: 5 – Smeet

24

Если вам не нравится Math.round(), вы можете использовать этот простой подход, а также:

int a = (int) (doubleVar + 0.5); 
+1

Очевидно, нет никакой веской причины не любить 'Math.round()': http://stackoverflow.com/a/6468757/1715716 –

+3

Это решение короче, не требует импорта и переносится для многих других языков программирования с минимальными изменениями. И это может быть даже быстрее в зависимости от вашей платформы: https://stackoverflow.com/questions/12091014/what-is-the-most-efficient-way-to-round-a-float-value-to-the-the -nearest-integer-in/12091343 # 12091343 –

+0

Я не критикую ваш ответ, который я нахожу ** очень полезным ** по той причине, о которой вы говорите. Я, по этому комментарию, обратился к людям, которые боялись бы использовать 'Math.round()', что буквально «совпадает с решением, которое вы предоставляете, вот и все. Приветствия. –

1

Документация Math.round говорит:

Возвращает результат округления аргумента a целое число. Результат эквивалентен (int) Math.floor(f+0.5).

Не нужно бросать в int. Возможно, это было изменено с прошлого.

+3

Существует 2 метода Math.round. Тот, который принимает float, возвращает целое число, это правильно. Но тот, который берет двойной, возвращает долго. –

0
public static int round(double d) { 
    if (d > 0) { 
     return (int) (d + 0.5); 
    } else { 
     return (int) (d - 0.5); 
    } 
} 
0

Функция Math.round перегружен Когда он получает значение с плавающей точкой, это даст вам Int. Например, это сработает.

int a=Math.round(1.7f); 

Когда он получает двойное значение, он даст вам длинный, поэтому вы должны привести его к int.

int a=(int)Math.round(1.7); 

Это делается для предотвращения потери точности. Ваше двойное значение - 64 бит, но тогда ваша переменная int может хранить только 32 бит, поэтому она просто преобразует ее в длинную, которая равна 64 бит, но вы можете привести ее к 32 бит, как объяснялось выше.