c# - 将小数四舍五入到第一个不为零的小数位

标签 c# .net math decimal rounding

我想将一个数字缩短到第一个不为 0 的有效数字。后面的数字应该四舍五入。

例子:

0.001 -> 0.001
0.00367 -> 0.004
0.00337 -> 0.003
0.000000564 -> 0.0000006
0.00000432907543029 ->  0.000004

目前我有以下流程:

if (value < (decimal) 0.01)
{
    value = Math.Round(value, 4);
}

注意:

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

从上面的示例可以看出,四舍五入到小数点后 4 位可能不够,而且值可能相差很大。

最佳答案

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

然后使用 precision 变量作为 Math.Round 第二个参数。

我对方法进行了一些修改,不仅可以支持零小数点,还可以支持所有十进制数。

static decimal RoundFirstSignificantDigit(decimal input) {

    if(input == 0)
       return input;

    int precision = 0;
    var val = input - Math.Round(input,0);
    while (Math.Abs(val) < 1)
    {
        val *= 10;
        precision++;
    }
    return Math.Round(input, precision);
}

我会为这个功能写一个扩展方法。

public static class FloatExtension
{
    public static decimal RoundFirstSignificantDigit(this decimal input)
    {
        if(input == 0)
            return input;

        int precision = 0;
        var val = input - Math.Round(input,0);
        while (Math.Abs(val) < 1)
        {
            val *= 10;
            precision++;
        }
        return Math.Round(input, precision);
    }
}   

然后像这样使用

decimal input = 0.00001;
input.RoundFirstSignificantDigit();

c# online

结果

(-0.001m).RoundFirstSignificantDigit()                  -0.001
(-0.00367m).RoundFirstSignificantDigit()                -0.004
(0.000000564m).RoundFirstSignificantDigit()             0.0000006
(0.00000432907543029m).RoundFirstSignificantDigit()     0.000004

关于c# - 将小数四舍五入到第一个不为零的小数位,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52440913/

相关文章:

c# - 如何/何时使用 json?

math - float 学坏了吗?

c# - ASP.NET 服务器端 View 状态

c# - 如何使用 C# 在 WinForm 中手动绑定(bind)到低功耗蓝牙设备?

c# - 已完成的 c# 任务再次运行...为什么?

c# - 在WinForms之间传递连续数据

asp.net - 结合CLR类库发布ASP.NET vNext/DNX

javascript - 在javascript中计算值,其中0是-50,1是50

c++ - 如何用矩形制作2点角并保持正确的厚度?

c# - 显示 ConnectionString 对话框