将值四舍五入到C#中的某些值列表

smo*_*med 8 .net c# math

我有一个双值列表,我想将变量的值舍入到只有那个数字列表

例:

列表内容为:{12,15,23,94,35,48}

变量的值为17,因此它将舍入为15

如果变量的值小于最小数,则它将四舍五入到它,如果它的值大于最大数,它将四舍五入到它.

列表内容总是根据外部因素而变化,所以我无法强调我想要向上或向下舍入的值.

怎么能在C#中做到?

Yuc*_*uck 8

这是使用LINQ的方法:

var list = new[] { 12, 15, 23, 94, 35, 48 };
var input = 17;

var diffList = from number in list
               select new {
                   number,
                   difference = Math.Abs(number - input)
               };
var result = (from diffItem in diffList
              orderby diffItem.difference
              select diffItem).First().number;
Run Code Online (Sandbox Code Playgroud)

编辑:重命名一些变量,以便代码不那么混乱......

编辑:

list变量是一个隐式声明的数组int.第一个LINQ语句diffList定义了一个匿名类型,它具有list(number)中的原始数字以及它与当前值(input)之间的差异.

第二个LINQ语句按result顺序命令匿名类型集合,这是你的"舍入"要求.它接受该列表中的第一项,因为它将具有最小的差异,然后仅选择.number匿名类型的原始项.


Seb*_*olm 7

假设数组已排序,您可以在数组中执行二进制搜索,将其缩小到给定数字之间的两个数字.

然后,一旦你有这两个数字,你只需四舍五入到最接近的两个数字.

static int RoundToArray(int value, int[] array) {
    int min = 0;
    if (array[min] >= value) return array[min];

    int max = array.Length - 1;
    if (array[max] <= value) return array[max];

    while (max - min > 1) {
        int mid = (max + min) / 2;

        if (array[mid] == value) {
            return array[mid];
        } else if (array[mid] < value) {
            min = mid;
        } else {
            max = mid;
        }
    }

    if (array[max] - value <= value - array[min]) {
        return array[max];
    } else {
        return array[min];
    }

}
Run Code Online (Sandbox Code Playgroud)

  • 在实践中当然没关系,但我注意到你正在寻找找到两个整数中点的"危险"方法.如果min + max恰好溢出到负值,那么一半是负数.有关该问题及其可能的解决方案的有趣分析,请参阅此文章:http://locklessinc.com/articles/binary_search/ (3认同)