Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/258.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在任意数字的上方和下方获取最接近的十位数_C#_Rounding - Fatal编程技术网

C# 在任意数字的上方和下方获取最接近的十位数

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

我想能够得到最接近的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.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)
            });