我希望能够使用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范围。
答案 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)
});
我得到的结果与预期一致: