将十进制数舍入到非零的第一个小数位

jul*_*old 19 .net c# math decimal rounding

我想将一个数字缩短为非0的第一个有效数字.后面的数字应该是四舍五入的.

例子:

0.001 -> 0.001
0.00367 -> 0.004
0.00337 -> 0.003
0.000000564 -> 0.0000006
0.00000432907543029 ->  0.000004
Run Code Online (Sandbox Code Playgroud)

目前我有以下程序:

if (value < (decimal) 0.01)
{
    value = Math.Round(value, 4);
}
Run Code Online (Sandbox Code Playgroud)

注意:

  • 数字永远是积极的
  • 有效位数始终为1
  • 大于0.01的值将始终舍入到两位小数,因此if <0.01

从上面的示例中可以看出,舍入到4个小数位可能不够,值可能会有很大差异.

D-S*_*hih 17

我会声明precision变量并使用迭代将该变量乘以10它没有命中的原始值,这precision将添加1.

然后使用precision变量是Math.Round第二个参数.

static decimal RoundFirstSignificantDigit(decimal input) {
    int precision = 0;
    var val = input;
    while (Math.Abs(val) < 1)
    {
        val *= 10;
        precision++;
    }
    return Math.Round(input, precision);
}
Run Code Online (Sandbox Code Playgroud)

我会为这个函数编写一个扩展方法.

public static class FloatExtension
{
    public static decimal RoundFirstSignificantDigit(this decimal input)
    {
        int precision = 0;
        var val = input;
        while (Math.Abs(val) < 1)
        {
            val *= 10;
            precision++;
        }
        return Math.Round(input, precision);
    }
}
Run Code Online (Sandbox Code Playgroud)

然后使用喜欢

decimal input = 0.00001;
input.RoundFirstSignificantDigit();
Run Code Online (Sandbox Code Playgroud)

c#online

结果

(-0.001m).RoundFirstSignificantDigit()                  -0.001
(-0.00367m).RoundFirstSignificantDigit()                -0.004
(0.000000564m).RoundFirstSignificantDigit()             0.0000006
(0.00000432907543029m).RoundFirstSignificantDigit()     0.000004
Run Code Online (Sandbox Code Playgroud)

  • 请注意,这需要调整负值. (4认同)