1

次のような変数を使用したい:

myVariable = 0.5
myQuery.filter(myTable.column1 == myVariable*myTable.column2)

all() を myQuery に適用しても結果はありません。変数をその値に置き換えればOKです。


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)

問題は、最後の 2 行 (factor1) にあります。最後の行で factor1 をその値に置き換えればOKです。

4

2 に答える 2

1

Python で使用される IEEE 浮動小数点数、および多くのデータベースは、学校の数学として常に機能するとは限りません。0.93 が機能した理由は、それが最初にデータベースに保存したビット単位の正確な値だったからです。ただし、減算にはわずかな誤差が生じます。

たとえば、これを参照してください。

>>> print "%0.64f" % (1.0 - 0.07)
0.9299999999999999378275106209912337362766265869140625000000000000
>>> print "%0.64f" % (0.93)
0.9300000000000000488498130835068877786397933959960937500000000000

ここで詳細を読む浮動小数点の比較を行うにはどうすればよいですか。次に、非常に詳細なエッセイについては、すべてのコンピューター科学者が浮動小数点演算について知っておくべきことを読むことができます...

1 つの解決策はdecimal.Decimal、Python とNumericSQL で使用することです。

于 2012-07-06T16:25:08.080 に答える
-1

説明しているコードに似たものをテストしましたが、変数またはリテラルのどちらを使用しても結果が得られます。

myVariable = 0.5
myQuery.filter(myTable.column1 == myVariable*myTable.column2).all()

対。

myQuery.filter(myTable.column1 == 0.5*myTable.column2).all()

生成されているリテラル SQL を投稿できますか? すなわち、

print myQuery

それらの両方のために?

于 2012-07-02T16:34:37.230 に答える