舍入十进制没有精度

时间:2015-03-01 08:23:25

标签: c# c#-4.0 rounding

我想将此十进制数14999994舍入为此值15000000,但Math.Round()对我不起作用!

请注意我的十进制数字没有任何精确度

1 个答案:

答案 0 :(得分:1)

static double RoundToSignificantDigits(double d, int digits)
{
    if (d == 0)
    {
        return 0;
    }

    double scale = Math.Pow(10, Math.Floor(Math.Log10(Math.Abs(d))) + 1 - digits);
    return Math.Sign(d) * scale * Math.Ceiling(Math.Abs(d) / scale);
}

它基于计算"比例"基于Math.Log10(但请注意Math.Abs为负数!),减去给定的数字精度,然后将数字除以"比例",舍入和重新乘以通过这个"规模"。请注意使用Math.Sign:我们将Math.Ceiling的绝对值向上舍入(d),然后重新附加"重新附加"标志。

使用它像:

double n = RoundToSignificantDigits(14999994, 2); // 15000000 

请注意double是一只丑陋的野兽:

double num = 0.2;
num += 0.1; // 0.30000000000000004

double num2 = RoundToSignificantDigits(num, 1); // 0.4