精度を失うことなく金額を合計する必要があるweb2pyアプリケーションを書いています。これにはDecimalsを使用する必要があることに気付きましたが、データベースから取得したすべての数値を次のようにラップする必要があることに気付きました。
Decimal(str(myval))
それをすべてのコードに追加することに夢中になる前に、もっと良い方法はありますか?私はPythonを初めて使用するので、明らかなことを見落としている可能性が非常に高くなります。
編集:私のデータベースはMS SQL Serverであり、SQL Servermoney
フィールドに金額を格納しています(実装はDecimalに類似していると思います。つまり、浮動小数点ではなく整数演算です)。
web2pyフレームワーク(pyodbc
SQL Server接続に使用)を介してデータベースに接続しています。web2pyは10進型をある程度サポートしていると思います。たとえば、私のweb2pyフィールド定義は次のようになります。ただし、web2pyのメソッドField('Amount','decimal(19,4)')
を使用してデータベースから値を返すと、値は。ではなくaとして返されます。.executesql
float
Decimal
編集:これはFreeTDSとMSSQLServerの問題のようです。Massimoがコメントで述べたように、web2pyはこれを適切にサポートし、Decimalを返します(可能な場合)。これは私の実稼働環境(Linux)でのみ問題であることがわかりました。FreeTDSドライバーを使用してMSSQLに接続していますが、MSSQLマネータイプをPythonフロートに変換しているようです。
アレックス・マルテッリの答えは正しい方向を向いていると思います。FreeTDS、MS SQL、Pythonの経験はありますか?これはおそらくそれ自体の質問に値すると思うので、この議論を移動します...(ここに投稿された新しい質問:MSSQLマネータイプをDecimalではなくpythonfloatに変換するFreeTDS )
更新:実際、FreeTDSにはバグがありました。これは、2010年8月4日の時点で、FreeTDS のCVSヘッドで修正されました。