查询近似相等

时间:2016-11-25 12:05:31

标签: ruby-on-rails postgresql activerecord decimal

给定一个十进制列,是否有一种查询近似相等的好方法?

您可以使用范围:

UIStoryboard* myStoryboard = self.storyboard;

    ScenarioPopOver* popOver = (ScenarioPopOver*)[myStoryboard instantiateViewControllerWithIdentifier:@"scenarioPopover"];

    popOver.modalPresentationStyle = UIModalPresentationPopover;
    [self presentViewController:popOver animated:YES completion:nil];

    // configure the Popover presentation controller
    UIPopoverPresentationController *popController = [popOver popoverPresentationController];
    popController.permittedArrowDirections = UIPopoverArrowDirectionUp;
    popController.delegate = self;
    popOver.preferredContentSize = CGSizeMake(400.0, 300.0);

    // in case we don't have a bar button as reference
    popController.sourceView = self.view;
    popController.sourceRect = CGRectMake(self.view.center.x - 150.0, 10.0, 0.0, 0.0);

但它看起来像Rails通常会尝试为你解决的一个常见问题,因为浮动数字并不总能完全表示。

2 个答案:

答案 0 :(得分:1)

我不确定是否有一个gem可以让你在活动记录中干净利落地执行此操作,但是您是否尝试过使用SQL舍入而不是使用范围?类似的东西:

Purchase.where('ROUND(total, 2) = ?', 30.67)

answer。还有docs中的链接。最后,考虑将数据存储在数据库中,就像在this answer中一样,然后只需将它们更改为显示,从而避免处理浮点数太多。

答案 1 :(得分:1)

我认为你在问题中这样做的方式是最好的方法。如您所知,Ruby在处理浮点值方面非常糟糕(尝试9.95 * 100)。只要您将数据库中的值存储为十进制值,而不是浮点数,您就可以了。

我唯一想要改进的是将其提取为类方法,例如:

# models/purchase.rb
def self.find_approximate(value, delta=0.1)
  where(total: (value - delta)..(value + delta))
end

Purchase.find_approximate(9.95).first