C# 在任意数字的上方和下方获取最接近的十位数
我想能够得到最接近的x十位数字上面和下面的任何数字使用C# 例如,如果我有一个4位数的数字,我希望所有的结束数字都在结尾的上方和下方,并设置一个2位数的数字,如30、50、80或00,那么C# 在任意数字的上方和下方获取最接近的十位数,c#,rounding,C#,Rounding,我想能够得到最接近的x十位数字上面和下面的任何数字使用C# 例如,如果我有一个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.0
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
其目的是计算给定资产价格和一组范围值周围的高/低范围。因为这实际上与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();
计算结果如下:
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)
});
我得到的结果和预期的一样:
你试过Math.Round吗?是的,我试过,还有Math.天花板(),诀窍是以一种通用于小数位数范围内的小数位数的方式进行操作,并向上/向下取整到正确的十位。然后你需要为其创建自己的逻辑。为什么
2126=>2100和2130
而不是2126=>2120和2130
?@Blorgbeard-因为这实际上不是10的取整。OP正在指定要舍入的数字。
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)
});