检查十进制是否与查询匹配时使用的最佳做法是什么



我有一个 for 循环,它循环一个交易列表,其中都包含金额。如果金额正确,我希望该交易包含在新列表中。

所以在代码中:

 decimal searchAmount = 33.03;
foreach (var order in listOforders)
{ 
  if(order.amount == searchAmount)
    {
      addOrderToList()
    }
} 

使用的货币使用的小数点不超过两位,所以没关系。这三种情况都应将顺序添加到列表中。

order.Amount = 33.03
search.Amount = 33   
order.Amount = 33.03
search.Amount = 33.03
order.Amount = 33.99
search.Amount = 33.9    

注意:

这是一个搜索。当客户回来并说"我购买的产品有问题,并且不是在注册客户处购买的"时,在客户银行收据上搜索金额是一项很棒的功能。这是一个零售实体店方案,因此一些客户选择不注册自己。

如果要完全放弃小数部分,请使用 LINQ 和 Math.Truncate 的组合

var orders = listOfOrders.Where(o => Math.Truncate(o.amount) == Math.Truncate(searchAmount))
                         .ToList();

Math.Truncate返回给定小数的整数部分,Where仅选择适当的顺序(如果您不知道,请阅读 LINQ 的延迟执行),ToList将查询具体化为列表。

编辑:

鉴于您的编辑,这可能是您正在寻找的:

var orders
   = listOfOrders.Where(
      o => Math.Truncate(o.amount) == Math.Truncate(searchAmount)
        && o.amount.ToString(CultureInfo.InvariantCulture)
                   .StartsWith(searchAmount.ToString(CultureInfo.InvariantCulture)))
                 .ToList();

这首先验证数字的整数部分是否匹配,然后使用字符串比较来检查实际金额是否以输入的内容(由懒惰用户)开始。

像这样使用 if 条件。四舍五入到小数点后 2 位并进行比较。

     if((Math.Round(order.amount,2) - Math.Round(searchAmount,2)) <= 0.9M)
    {
      addOrderToList();
    }

如果你使用Math.Truncate(number)怎么办?就像:

if(Math.Truncate(order.amount) == Math.Truncate(searchAmount))
如果我

是对的,你需要定义一些最大差分常数并使用它类似的东西

decimal maxDiff = 0.03;
decimal searchAmount = 33.03;
var result =  listOfOrders.Where(o => Math.Abs(o.Amount - searchAmount) <=  maxDiff);

您需要使用Math.Floor方法来匹配所有数字,即绝对值

decimal searchAmount = 33.03;
var temp = Math.Floor(searchAmount);
foreach (var order in listOforders)
{ 
  if(Math.Floor(order.amount) == temp)
  {
    addOrderToList()
  }
} 

不需要任何对Math的调用,因为演员int也会这样做。您的代码可以更改为;

int searchAmount = 33;
listOforders.Where(o => (int)o.Amount == searchAmount)
            .ForEach(o => addOrderToList());

相关内容

  • 没有找到相关文章