我想使用这样的变量:
myVariable = 0.5
myQuery.filter(myTable.column1 == myVariable*myTable.column2)
当我将all()应用于myQuery时,我没有任何结果。 如果我用它的值替换变量,那就没关系。
queryBidOffer = session.query(BidOffer.id, BidOffer.price, BidOffer.qmin, BidOffer.qmax)
queryBidOffer = queryBidOffer.join(Equipment).filter(BidOffer.equipment==Equipment.id, Equipment.equipment_type.in_(['L','P','W','M']))
queryBidOffer_day = queryBidOffer.filter(BidOffer.day == day)
queryBidOffer_hour = queryBidOffer_day.filter(BidOffer.start_hour == timeSlice)
queryBidOffer_hour = queryBidOffer_hour.join(EquipmentDayHour, BidOffer.equipment == EquipmentDayHour.equipment)
queryBidOffer_hour = queryBidOffer_hour.filter(EquipmentDayHour.day == day)
queryBidOffer_hour = queryBidOffer_hour.filter(EquipmentDayHour.hour == timeSlice)
factor1 = 1.00 - 0.07
queryBidOffer_hour = queryBidOffer_hour.filter(BidOffer.equipment == EquipmentDayHour.equipment, factor1*func.abs(EquipmentDayHour.ref_prog) == 930)
问题在于最后两行(factor1)。 在最后一行中,如果我将factor1替换为其值,则可以。
答案 0 :(得分:1)
Python使用的IEEE浮点数,许多数据库并不总是像学校的数学一样工作。 0.93工作的原因是,这是您最初存储在数据库中的按位精确值。但减法中会出现轻微错误。
见例如:
>>> print "%0.64f" % (1.0 - 0.07)
0.9299999999999999378275106209912337362766265869140625000000000000
>>> print "%0.64f" % (0.93)
0.9300000000000000488498130835068877786397933959960937500000000000
在这里阅读更多How should I do floating point comparison,然后在非常深入的文章中,您可以阅读What Every Computer Scientist Should Know About Floating-Point Arithmetic ...
一种解决方案可能是在Python中使用decimal.Decimal
,在SQL中使用Numeric
。
答案 1 :(得分:-1)
我刚刚测试了类似于您所描述的代码的内容,但无论是使用变量还是文字都可以获得结果:
myVariable = 0.5
myQuery.filter(myTable.column1 == myVariable*myTable.column2).all()
VS
myQuery.filter(myTable.column1 == 0.5*myTable.column2).all()
你可以发布正在生成的文字SQL吗?即
的结果print myQuery
对于这两个人?