【问题标题】:How to round up to nearest 10 or 100 or x [duplicate]如何四舍五入到最接近的 10 或 100 或 x [重复]
【发布时间】:2016-09-08 16:50:20
【问题描述】:

How to round up to the nearest 10 (or 100 or X)?

这个链接提供了r中问题的解决方案,我们如何在java中实现类似的东西?

这不是简单舍入的情况,而是根据值本身进行一些复杂的舍入,例如0.0322 至 0.04, 3.22 至 4, 32.2 至 40, 42.2 至 50 和 422.2 到 500。

【问题讨论】:

  • new = round(x / 10) * 10?
  • 这不是这些问题的重复,这种情况下的四舍五入取决于要四舍五入的值

标签: java rounding


【解决方案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

【讨论】:

  • 感谢 Dac Saunders :)
【解决方案2】:

我想不出这个问题被否决的许多原因,尤其是因为没有说“X”必须是 10 的效力。

如果您的“X”是 10 的效力,您可能会发现 Enum RoundingMode 和 MathContext 和 BigDecimal 类很有帮助。 详情请看 https://docs.oracle.com/javase/8/docs/api/

无论如何: 此 Java 方法处理 any 舍入基数大于 1 的舍入 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;
}

希望对你有帮助。

【讨论】:

  • 重要的不是我想什么,而是什么是正确的以及 Aisf Altaf 需要计算的数字集是什么。也许最重要的答案是什么。我不知道,提问者需要决定。
  • 我认为我的公式 (Math.ceil(x*Math.pow(10, -Math.floor(Math.log10(x)))) / Math.pow(10, -Math.floor(Math.log10(x))) ) 仅适用于 10 的效力,但 java 可以具有适用于任何基数的 log 函数。
猜你喜欢
  • 2011-09-21
  • 2010-09-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-01-29
  • 1970-01-01
  • 1970-01-01
  • 2017-07-26
相关资源
最近更新 更多