2017-07-26 9 views
-1

Pythonプログラムは自動的に浮動経度で追加の数値を追加します。私は新しい列 "src"、 "des"をcsvの他のものを使って作成しています。結果csvの行番号4を見ることができます。 "des"には、Dropoff_longitudeとは異なる経度値が含まれています。しかし、私はそれと同じ価値を望んでいます。タプルの作成中に変更はありません。自動的に10進数の後に数字を追加する

コード:

import pandas as pd 
import numpy as np 

def loc(x): 

    return (round(x[0],14),round(x[1],14)) 


columns=["Pickup_latitude","Pickup_longitude","Dropoff_latitude","Dropoff_longitude"] 
df=pd.read_csv("demo.csv") 
df["src"]=df[ ["Pickup_latitude","Pickup_longitude"] ].apply(loc,axis=1) 
df["des"]=df[ ["Dropoff_latitude","Dropoff_longitude"] ].apply(loc,axis=1) 
df.to_csv("result.csv",index=False) 

私は、これは、Pythonに固有ではない私のresult.csv

+1

結果をリンクではなく質問に掲載してください。また、リンクは表示されません。私はあなたがあなたのテキストに脚注番号を置くことを怠ったと思います。 – Prune

+0

は、画像を追加することができませんでしたが、次のようにresult.csvの行は次のとおりです。-73.8441085815 \t 40.7211074829 \t -73.8163299561 \t 40.7143745422 \t(40.7211074829、-73.8441085815)\t(40.7143745422、-73.81632995609999) 最後の2列は「、 "SRC" ですdes " –

+1

再度、その結果を* question *に投稿してください。 – Prune

答えて

0

の写真を追加しました。実数(浮動小数点数)の精度に問題があります。バイナリでの内部表現は、ほとんどの分数では正確ではありません。ランタイムシステムは、管理できる最も近い近似を提供します。そのバイナリ番号が書き出されると、内部バイナリの最良の10進表現が得られます。 floatに変換すると元の入力が失われます。

元のファイルの桁数を正確に維持したい場合は、出力時に必要な書式設定(ヘルプのためのPython出力書式を参照)、またはすべての処理を文字列として行う必要がありますフロートに変換する。

あなたは動いていますか?

1

私には分かりますが、-73.81632995609999はオフになっている唯一の番号であり、非常に小さいマージンでオフになっています。これは、Pythonが浮動小数点数を表示する方法のためによく書かれている問題です。 python websiteから:

のPythonを実行している典型的なマシンで、そこPythonのフロートのために利用可能な高精度の53ビットであるので、あなたが小数0.1を入力すると、内部的に格納された値は近くなるバイナリ分数 0.00011001100110011001100110011001100110011001100110011010あります正確には1/10にはならない。

浮動小数点数がインタプリタプロンプトに表示されるため、格納された値が元の小数部の近似値に近いことを忘れてしまいます。 Pythonはマシンが保存しているバイナリ近似の真の10進値に10進法の近似値を出力します。

表現誤差が参照:Pythonは0.1ために格納されたバイナリ近似の真進値を出力した場合、それは小さな表現エラーについて具体

>>> 0.1 0.1000000000000000055511151231257827021181583404541015625

を表示しなければなりませんいくつかの(ほとんどの、実際には)小数部分は、2進(2の)小数部分として正確に表現できないという事実です。なぜそれがある

>>> 0.1 + 0.2 0.30000000000000004

:これは、Python(あるいはPerlやC、C++、Javaの、FORTRAN、および他の多く)は、多くの場合、あなたが期待する正確な進数が表示されない理由チーフ理由は? 1/10および2/10は、2進小数として正確に表現できません。今日のほとんどのマシン(2010年7月)はIEEE-754浮動小数点演算を使用しており、ほとんどすべてのプラットフォームがPythonの浮動小数点数をIEEE-754の「倍精度」に対応付けています。 754倍には53ビットの精度が含まれているので、入力時にコンピュータは0.1をJ/2 ** Nという形式の最も近い分数に変換しようとします。ここで、Jは正確に53ビットを含む整数です。

要するに、この変更は、Pythonが数値を格納する方法のために発生します。あなたは10^nを乗算してこれらの値を整数として保存し、計算に必要なときに分割することができます。あなたが単純な計算をしているのであれば、Pythonによって作成された小さな違いはそれらに大きな影響を与えるべきではありません。お役に立てれば。

関連する問題