给定一个十进制列,是否有一种查询近似相等的好方法?
您可以使用范围:
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通常会尝试为你解决的一个常见问题,因为浮动数字并不总能完全表示。
答案 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