How to round down to the nearest power of 10?
I can't even find search keywords for this. Пожалуйста, рассмотрите этот код:
float inputValue = getInputValue();
float resultValue;
if (inputValue < 0.1f) {
resultValue = 0.01f;
}
else if (inputValue < 1.0f) {
resultValue = 0.1f;
}
else if (inputValue < 10.0f) {
resultValue = 1.0f;
}
else {
resultValue = 10.0f;
}
и так далее. Должен быть более элегантный способ сделать это. I guess the solution is easy, but I try to find a way now for 2 hours and read about round, ceil, floor...can't find it.
У кого-нибудь есть идея?
4 ответа
Я уверен, что есть намного более простой способ, который не пытается продвигаться вперед от первых принципов, но как насчет:
float inputValue = getInputValue();
float log10 = floorf(log10f(inputValue));
float modulo = powf(10.0f, log10);
inputValue -= fmodf(inputValue, modulo);
РЕДАКТИРОВАТЬ: на самом деле, я думаю, я хотел бы, чтобы вы хотели округлить 230 до 200, 0,73 до 0,7 и т.д. Я оставляю это на том основании, что это может быть полезно в любом случае.
Ваш код не делает то, что вы думаете. Для любого значения меньше 100 (включая 0,001), resultValue будет установлено равным 10. Вам нужно будет проверить в обратном порядке.
Я бы начал с записи спецификации для этой функции: какие именно выходные значения вы ожидаете для каких входных значений? Ожидаете ли вы 1.0e17 для входа 1.01e17? Что если ввод 0 или -1?
Вот версия BigInteger. Мне нужна была следующая (а не ближайшая) сила 10, но вы видите идею:
import java.math.BigInteger;
class A {
public static void main(String[]args) {
System.out.println("hi");
for (long v : new long[] {0,1,2,9,10,11,99,100,101,12345678,123456789012345678L,1234567890123456789L}) {
System.out.println(""+v+" ==> "+nextPowerOf10(v));
}
}
static long nextPowerOf10(long v) {
return BigInteger.TEN.pow((int)Math.max(0,1+Math.floor(Math.log10(v)))).longValue();
}
}
Если вы хотите, чтобы на степенях 10 он вел себя по-другому, поиграйте с 1+Math.floor
выше (0/1, этаж / потолок / круглый). Кстати, что значит ОП под "ближайший"? Ближайший в линейном или в логарифмическом масштабе? Ближайший больший или ближайший меньший?
>java A
hi
0 ==> 1
1 ==> 10
2 ==> 10
9 ==> 10
10 ==> 100
11 ==> 100
99 ==> 100
100 ==> 1000
101 ==> 1000
12345678 ==> 100000000
123456789012345678 ==> 1000000000000000000
1234567890123456789 ==> -8446744073709551616