Java - 舍入数字增加数字位数

时间:2014-10-08 20:49:28

标签: java performance rounding

最有效的方法(在Java中)将数字n舍入到最接近10的幂,其中包含的数字比原始数字多一个?

e.g。 3 - > 10

432 - > 1000

241,345 - >百万

有没有办法将它放在一个O(1)行中?

我能看到的一种简单方法是使用for循环并增加10的幂,直到n /(10 ^ i)<1。 1,但那不是O(1)而是O(log n)。 (好吧,我正在猜测它的日志,因为它涉及到权力!)

2 个答案:

答案 0 :(得分:5)

如果您正在寻找字符串,可以使用Math.log10在数组中找到正确的索引:

// Do more of these in reality, of course...
private static final String[] MESSAGES = { "1", "10", "100", "1,000", "10,000" };

public static final String roundUpToPowerOf10(int x) {
    return MESSAGES[(int) Math.ceil(Math.log10(x))];
}

如果您希望它返回具有正确值的整数,您可以使用Math.pow

public static final int roundUpToPowerOf10(int x) {
    return (int) Math.pow(10, Math.ceil(Math.log10(x)));
}

答案 1 :(得分:2)

尝试

double input = ...
double output = Math.pow(10, Math.ceil(Math.log10(input)));

然后您可以将输出转换为整数。操作量是恒定的,因此单个输入可以保证O(1)。