C#将双数四舍五入到第一个有意义的小数位[重复] 。

问题描述 投票:0回答:1

我有一个重载的扩展方法,可以将小数或双数四舍五入到小数点后的N位,而且工作得很完美。

public static class NumberExtensions
{
    public static string ToStringNDecimalPlaces(this double dbValue, int nDecimal)
    {
        return dbValue.ToString("N" + nDecimal);
    }

    public static string ToStringNDecimalPlaces(this decimal dbValue, int nDecimal)
    {
        return dbValue.ToString("N" + nDecimal);
    }
}

我的问题是,我想创建另一个类似 "ToStringFirstDecimalPlace "或类似的方法,它接收小数值并将其四舍五入到0之后的第一个逻辑小数值。让我给一些,我希望这个方法是这样的。

例如:

  • 0.000345879 = 0.0003
  • 0.019356 = 0.02
  • 0.1 = 0.1

因此,它忽略了前导的0,并将第n位取为第一个有意义的逻辑数,而不是仅仅取整为0.0。

c# math decimal rounding
1个回答
0
投票

那么你就不能先算出0的个数,然后再进行相应的格式化吗?

例如对于正值。

string result;
if(dbValue != 0)
{
    int count = 0;
    var copyDb = dbValue;
    while(copyDb < 1)
    {
        copyDb *= 10;
        count++;
    }
    result = dbValue.ToStringNDecimalPlaces(count);
}
else
{
    result = "0";
}

0
投票

你可以写下面的函数来实现这个功能。

public static string ToStringNDecimalPlacesIgnoreZeros(this double dbValue)
{

    var value = dbValue - Math.Floor(dbValue); // Get rid of integer digits
    int position = 0;
    while (value > 0 && Math.Floor(value) == 0)
    {
        value = value * 10;
        position += 1;
    }

    if (value == 0)
        return dbValue.ToString("N");
    else
        return dbValue.ToStringNDecimalPlaces( position);
}

0
投票

首先,假设输入值在0到1之间,包括在内。如果不是,则先减去整数部分(如果是负数,则否定剩余部分),然后再对其余部分进行四舍五入(这个过程可以在四舍五入完成后反过来)。然后,做类似这样的事情。

RountToFirstLogical(input)
1. place = 1
2. while place > input
3.    place = place / 10
4. input = round(input/place) * place
5. return input

例子:

input=0.000345879
place=1, 0.1, 0.01, 0.001, 0.0001
input/place = 3.45879
round(input/place) = 3
round(input/place) * place = 0.0003

input=0.019356
place=1, 0.1, 0.01
input/place = 1.9356
round(input/place) = 2
round(input/place)*place = 0.02

input=0.1
place=1, 0.1
input/place=1
round(input/place)=1
round(input/place)*place=0.1
© www.soinside.com 2019 - 2024. All rights reserved.