无精度舍入小数

本文关键字:小数 舍入 精度 | 更新日期: 2024-09-20 11:16:52

我想把这个十进制数14999994四舍五入到这个值15000000,但Math.Round()对我不起作用!

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

无精度舍入小数

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的使用:我们将d的绝对值四舍五入(Math.Ceiling),然后"重新附加"符号。

像一样使用

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

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

double num = 0.2;
num += 0.1; // 0.30000000000000004
double num2 = RoundToSignificantDigits(num, 1); // 0.4