获取高于和低于任何数字的最接近的十位数字
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)
});
我得到的结果符合预期:
我希望能够使用 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)
});
我得到的结果符合预期: