获取高于和低于任何数字的最接近的十位数字

get nearest tens-place number above and below any number

我希望能够使用 C# 获取任何数字上方和下方最近的 x 十位数字

例如,如果我有一个 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 范围。

因为这实际上与 10 的舍入没有任何关系,所以您必须指定要截断的位数,然后遍历 "set point" 值以找到最接近的两个点给定输入。

这是我想出的:

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)
            });

我得到的结果符合预期: