これはこれに対するフォローアップの質問であり、私もこれを見ました。私の Python スクリプトは、実行のたびにデータを収集し、データを URL に送信します。URL には、小数点以下 2 桁までのデータ/値を表示する必要があります。以下に示すように、値を小数点以下 2 桁に丸めるようにスクリプトを変更しました。その後、すべての print ステートメントで、スクリプトが小数点以下 2 桁に丸められていることがわかります。urlencode の後でも、params をデコードすると、小数点以下 2 桁が表示されます。しかし、URL では、値はすべての小数点以下の桁数で表示されます。たとえば、1.0 ではなく、1.000342760436734 と表示されますが、値は 1.00 として表示され、それ以上では表示されません。
印刷出力を含むスクリプトのコードは次のとおりです。
//スクリプトによって収集されるデータ - 辞書のリスト。
y = [{'a': 80.0, 'b': 0.0786235, 'c': 10.0, 'd': 10.6742903}, {'a': 80.73246, 'b': 0.0, 'c':
10.780323, 'd': 10.0}, {'a': 80.7239, 'b': 0.7823640, 'c': 10.0, 'd': 10.0}, {'a':
80.7802313217234, 'b': 0.0, 'c': 10.0, 'd': 10.9762304}]
//小数点以下2桁を四捨五入するコード
class LessPrecise(float):
def __repr__(self):
return str(self)
def roundingVals_toTwoDeci(y):
for d in y:
for k, v in d.iteritems():
v = LessPrecise(round(v, 2))
print v
d[k] = v
//Json.dumps
roundingVals_toTwoDeci(y)
j = json.dumps(y)
print j
//print j が与える
[{"a": 80.0, "b": 0.0, "c": 10.0, "d": 10.0}, {"a": 100.0, "b": 0.0, "c": 0.0, "d": 0.0}, {"a":
80.0, "b": 0.0, "c": 10.0, "d": 10.0}, {"a": 90.0, "b": 0.0, "c": 0.0, "d": 10.0}]
//URLエンコード
params = urllib.urlencode({'thekey': j})
//パラメータをデコードした後、取得します
thekey=[{"a": 80.0, "b": 0.0, "c": 10.0, "d": 10.0}, {"a": 100.0, "b": 0.0, "c": 0.0, "d":
0.0}, {"a": 80.0, "b": 0.0, "c": 10.0, "d": 10.0}, {"a": 90.0, "b": 0.0, "c": 0.0, "d": 10.0}]
//ここまでは順調ですね。ただし、URL には ではなく10.0
、 が表示されます10.000436783313897
。何が起こっているのか、それを修正する方法はわかりません。
次のように、値を文字列に直接変換した後でも、URL で同じ float 値を取得することに注意してください。
def roundingVals_toTwoDeci(y):
for d in y:
for k, v in d.iteritems():
d[k] = str(round(v, 2))
return
これにより、 print s=json.dumps() は {"a": "10.0", "b": "3.1", etc.} のような値を返しますが、URL では値は 10.856473985798743 です。