5

精度を失うことなく金額を合計する必要があるweb2pyアプリケーションを書いています。これにはDecimalsを使用する必要があることに気付きましたが、データベースから取得したすべての数値を次のようにラップする必要があることに気付きました。

Decimal(str(myval))

それをすべてのコードに追加することに夢中になる前に、もっと良い方法はありますか?私はPythonを初めて使用するので、明らかなことを見落としている可能性が非常に高くなります。

編集:私のデータベースはMS SQL Serverであり、SQL Servermoneyフィールドに金額を格納しています(実装はDecimalに類似していると思います。つまり、浮動小数点ではなく整数演算です)。

web2pyフレームワーク(pyodbcSQL Server接続に使用)を介してデータベースに接続しています。web2pyは10進型をある程度サポートしていると思います。たとえば、私のweb2pyフィールド定義は次のようになります。ただし、web2pyのメソッドField('Amount','decimal(19,4)') を使用してデータベースから値を返すと、値は。ではなくaとして返されます。.executesqlfloatDecimal

編集:これはFreeTDSとMSSQLServerの問題のようです。Massimoがコメントで述べたように、web2pyはこれを適切にサポートし、Decimalを返します(可能な場合)。これは私の実稼働環境(Linux)でのみ問題であることがわかりました。FreeTDSドライバーを使用してMSSQLに接続していますが、MSSQLマネータイプをPythonフロートに変換しているようです。

アレックス・マルテッリの答えは正しい方向を向いていると思います。FreeTDS、MS SQL、Pythonの経験はありますか?これはおそらくそれ自体の質問に値すると思うので、この議論を移動します...(ここに投稿された新しい質問:MSSQLマネータイプをDecimalではなくpythonfloatに変換するFreeTDS )

更新:実際、FreeTDSにはバグがありました。これは、2010年8月4日の時点で、FreeTDS のCVSヘッドで修正されました。

4

2 に答える 2

8

まず、データベースにすべての数値を10進数で保持します。使用しているDBエンジンについては言及しませんが、すべてのエンジンがそのような機能をサポートしています。たとえば、MySQLDECIMALタイプドキュメントを次に示します。すでにそれを行っていることを願っていますが、そうでない場合でも、スキーマを変更するだけの価値はあります。

次に、DBとの間の型変換が、データベースの小数とPythonの小数と一致することを確認する必要があります。残念ながら、DB-API実装全体でそれを行う標準的な方法はありませんが、ほとんどの場合、方法が提供されています。たとえば、MySQLDBでは、「タイプコンバータディクショナリ」と呼ばれるconv=パラメータを渡す必要があります。デフォルトはのコピーですが、もちろん、小数で正しいことを行うように拡張できます。使用しているDBと、それに使用するDB-APIコネクタパッケージを教えていただければ、このテーマに関するより詳細なヘルプを提供できる場合があります。connectMySQLdb.converters.conversions

編集:@unutbuは、現在のMySQLdbコンバーターはすでに小数を正しく変換しているとコメントしています。したがって、MySQLdbの非常に古いリリースに固執しない限り、すべての数値を小数として正しく保持している限り、問題はありません。 DBで(イェーイ!)。

于 2010-07-29T16:57:46.537 に答える
0

データベースから数値を取得し、それを10進数に変換する関数を作成できます。次に、それをコードで使用します。

于 2010-07-29T16:40:48.213 に答える