2016-12-23 23 views
1

新しいmongodbデータタイプNumberDecimalで遊んでいます。私は一般に正確な精度(または可能な限り正確)を必要とする科学的なアプリケーションを構築するので、私はそれをどのように使うことができるのだろうかと思っています。MongoDB NumberDecimal:+: 'Decimal128'と 'Decimal128'のサポートされていないオペランドタイプ

私が構築しているアプリケーションの1つは、データベースからデータを取り出し、さまざまな計算を実行するpythonフラスコアプリケーションです。私はMongoDBのからNumberDecimalを引く(のはNumberDecimal('24.55')を言わせて)とpythonで私が作成したbson.decimal128.Decimal128数に追加し、それを追加しようとすると、しかし、私は次のエラーを取得:

TypeError: unsupported operand type(s) for +: 'Decimal128' and 'Decimal128' 

をそして私が変換しようとした場合

TypeError: Cannot convert Decimal128('24.55') to Decimal 

は、だから私は、私はいくつかの質問を持っていると思います:NumberDecimaldecimal.Decimal(または何か他)に(1)されていない場合(2)、である、私はPythonで使用できるものには、このNumberDecimalを変換するために、とにかくそこにありますデータ型は他のすべての数値を012と互換性があるものに変換できます、(3)そうでない場合は、集約フレームワークを使用しているサーバ側(他のユースケースはありますか)を使用できる唯一の方法と思われますか?

答えて

2

操作するためにDecimal128インスタンスを標準的なPython小数点にキャストする必要があるようです。しかし、create_decimal128_contextbson.decimal128)によって作成されたコンテキスト内でこれを実行し、結果を後でデータベースに格納できるようにする必要があります。

>>> from bson.decimal128 import Decimal128, create_decimal128_context 
>>> import decimal 
>>> 
>>> D128_CTX = create_decimal128_context() 
>>> 
>>> with decimal.localcontext(D128_CTX): 
...  d1 = Decimal128('1.23') 
...  d2 = Decimal128('3.21') 
...  d3 = Decimal128(d1.to_decimal() + d2.to_decimal()) 
... 
>>> print(d3, type(d3)) 
4.44 <class 'bson.decimal128.Decimal128'> 
>>> print(d3.to_decimal(), type(d3.to_decimal())) 
4.44 <class 'decimal.Decimal'> 
>>> decimal.Decimal(d3) 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
TypeError: conversion from Decimal128 to Decimal is not supported 

そして、あなたはPythonのdecimal型にキャストするために、上記の最後の二つのコマンドで見ることができるように、Decimal128.to_decimalメソッドを使用します。 DecimalコンストラクタにDecimal128インスタンスを渡そうとしないでください。

Python 3.6およびpymongo 3.4でテスト済みです。

bson.decimal128モジュールのpymongoのdocumentationに触発されています。

+1

恐ろしい私の男!私はこれらの "精密な"ラッパーを使用する頭痛が実際には精度/正確さに無視できる利得の価値がないことを認識しています –

関連する問題