在任何数字的上方和下方获得最接近的十位数

时间:2016-05-12 00:35:44

标签: c# rounding

我希望能够使用C#

获取最接近任何数字的x-tens-place数字

例如,如果我有一个4位数字,我希望所有结束数字在上方和下方结束,并设置2位数字,如30,50,80或00,那么

2126 => 2100 and 2130
2146 => 2130 and 2150
2183 => 2180 and 2200

我希望能够在1以下执行此操作,例如,如果我的级别为0.0030,0.0050,0.0080和0.0000,那么如果我有以下数字

1.0026 => 1.0000 and 1.0030
1.0046 => 1.0030 and 1.0050
1.0083 => 1.0080 and 1.0100

这样做的目的是计算给定资产价格和一组范围值的hi / lo范围。

1 个答案:

答案 0 :(得分:1)

因为这与10的舍入无关,你必须指定要截断的位数,然后迭代“设定点”值以找到给定输入的两个最接近的点。

这就是我提出的:

Func<double, double[], int, double> lower = (x, sps, d) =>
    sps
        .Select(sp => sp + Math.Truncate(Math.Pow(10.0, d) * x) / Math.Pow(10.0, d))
        .Where(v => v <= x)
        .Last();

Func<double, double[], int, double> upper = (x, sps, d) =>
    sps
        .Select(sp => sp + Math.Truncate(Math.Pow(10.0, d) * x) / Math.Pow(10.0, d))
        .Where(v => v >= x)
        .First();

我的输入data是:

var data = new []
{
    new
    {
        setpoints = new double[] { 0, 30, 50, 80, 100 },
        digits = -2,
        values = new double[] { 2126, 2146, 2183 },
    },
    new
    {
        setpoints = new [] { 0.0, 0.003, 0.005, 0.008, 0.01 },
        digits = 2,
        values = new [] { 1.0026, 1.0046, 1.0083 },
    },
};

结果计算如下:

var results =
    data
        .SelectMany(
            x => x.values,
            (x, v) => new
            {
                value = v,
                lower = lower(v, x.setpoints, x.digits),
                upper = upper(v, x.setpoints, x.digits)
            });

我得到的结果与预期一致:

results