如何四舍五入到最接近的10的幂

How to round down to the nearest power of 10?

本文关键字:的幂 最接近 四舍五入      更新时间:2023-10-16

我甚至找不到搜索关键字。请考虑以下代码:

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;
}

等等。一定有一种更优雅的方式来做到这一点。我想解决办法很简单,但我试着找到一个方法,现在2个小时,阅读关于圆,天花板,地板……找不到

有人知道吗?

powf(10.0f, floorf(log10f(value)))

我相信有一个更简单的方法,不试图从第一原则向前工作,但是如何:

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.01e17的输入,你期望1.0e17吗?如果输入是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,地板/天花板/圆形)。顺便问一下,"最近"下面的OP是什么意思?最接近线性尺度还是对数尺度?更大还是更小?

>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