2016-09-08 5 views
-3

How to round up to the nearest 10 (or 100 or X)?Как округлить до ближайших 10 или 100 или х

ссылка обеспечивает решение проблемы в г, как мы можем достичь нечто подобного в Java?

Это не случай простого округления, а немного сложное округление в зависимости от самого значения, например. 0,0322 до 0,04, 3,22 до 4, 32,2 до 40, 42,2 до 50 и 422,2 до 500.

+2

'новый = круглый (х/10) * 10'? –

+0

это не дубликат этих вопросов, округление в этом случае зависит от значения, которое округляется от –

ответ

1

Пожалуйста, попробуйте эту формулу

System.out.println(Math.ceil(x*Math.pow(10, -Math.floor(Math.log10(x))))/Math.pow(10, -Math.floor(Math.log10(x)))) ; Вы можете попробовать эту формулу online.

class Main { 
    public static void niceround(double x) { 
     System.out.println(x+" to " + Math.ceil(x * Math.pow(10, -Math.floor(Math.log10(x))))/Math.pow(10, -Math.floor(Math.log10(x)))); 
    } 
    public static void main(String[] args) { 
     niceround(0.0322); 
     niceround(3.22); 
     niceround(32.2); 
     niceround(42.2); 
     niceround(422.2); 
    } 
} 

тест

/usr/lib/jvm/java-1.8.0-openjdk-amd64/bin/java -agentlib:jdwp=transport=dt_socket,address=127.0.0.1:36808,suspend=y,server=n -Dfile.encoding=UTF-8 -classpath /usr/lib/jvm/java-1.8.0-openjdk-amd64/jre/lib/charsets.jar:/usr/lib/jvm/java-1.8.0-openjdk-amd64/jre/lib/ext/cldrdata.jar:/usr/lib/jvm/java-1.8.0-openjdk-amd64/jre/lib/ext/dnsns.jar:/usr/lib/jvm/java-1.8.0-openjdk-amd64/jre/lib/ext/icedtea-sound.jar:/usr/lib/jvm/java-1.8.0-openjdk-amd64/jre/lib/ext/jaccess.jar:/usr/lib/jvm/java-1.8.0-openjdk-amd64/jre/lib/ext/localedata.jar:/usr/lib/jvm/java-1.8.0-openjdk-amd64/jre/lib/ext/nashorn.jar:/usr/lib/jvm/java-1.8.0-openjdk-amd64/jre/lib/ext/sunec.jar:/usr/lib/jvm/java-1.8.0-openjdk-amd64/jre/lib/ext/sunjce_provider.jar:/usr/lib/jvm/java-1.8.0-openjdk-amd64/jre/lib/ext/sunpkcs11.jar:/usr/lib/jvm/java-1.8.0-openjdk-amd64/jre/lib/ext/zipfs.jar:/usr/lib/jvm/java-1.8.0-openjdk-amd64/jre/lib/jce.jar:/usr/lib/jvm/java-1.8.0-openjdk-amd64/jre/lib/jsse.jar:/usr/lib/jvm/java-1.8.0-openjdk-amd64/jre/lib/management-agent.jar:/usr/lib/jvm/java-1.8.0-openjdk-amd64/jre/lib/resources.jar:/usr/lib/jvm/java-1.8.0-openjdk-amd64/jre/lib/rt.jar:/home/dac/proj/javatest2016/out/production/javatest2016:/home/dac/Downloads/idea-IU-145.972.3/lib/idea_rt.jar Main 
Connected to the target VM, address: '127.0.0.1:36808', transport: 'socket' 
0.0322 to 0.04 
3.22 to 4.0 
32.2 to 40.0 
42.2 to 50.0 
422.2 to 500.0 
Disconnected from the target VM, address: '127.0.0.1:36808', transport: 'socket' 

Process finished with exit code 0 
+0

спасибо Dac Saunders :) –

1

Я не могу думать о многих причин, почему этот вопрос был downvoted, особенно потому, что не было сказано, что «X «ДОЛЖНА быть потенцией 10.

Если ваш« X »означает эффективность 10, вы можете найти Enum RoundingMode и классы MathContext и BigDecimal. Для получения дополнительной информации см https://docs.oracle.com/javase/8/docs/api/

В любом случае: Этот метод Java обрабатывает округление Int для любой округления база больше один:

int round(int num, 
      int base /* "X", MUST be greater than 1 */, 
      boolean roundMiddleUp /* true is usual in business calculations */) { 
    int lower = (num/base) * base - (num < 0 ? base: 0); 
    int upper = lower + base; 

    int difLower = Math.abs(num - lower); 
    int difUpper = Math.abs(num - upper); 
    int rounded = (difLower < difUpper) ? lower : (difLower != difUpper) ? upper : roundMiddleUp ? upper : lower; 
    return rounded; 
} 

Надеется, что это помогает.

+0

. Что имеет значение, НЕ то, что я ДУМАЮ, но что правильно и что такое набор чисел, которые нужно вычислить Aisf Altaf. Может быть, это также важно, что является наиболее обучающим ответом. Я не знаю, вопросник должен решить. –

+0

Я думаю, что моя формула ('Math.ceil (x * Math.pow (10, -Math.floor (Math.log10 (x))))/Math.pow (10, -Math.floor (Math.log10 (x))) ') работает только с эффективностью в десять, но у java может быть функция' log' для любой базы. –