0

この作品の私の目的は、印刷された値をデータベースに取得することですが、ターミナルからのクエリでは、データベースは印刷された値ではなく浮動小数点を返します。これを強制的にデータベースに渡す方法があります。ここに私のコードがあります

def getCpuLoad():
   """
   Returns the cpu load as a value from the interval [0.0, 1.0]
   """
   dt = list(deltaTime(INTERVAL))
   idle_time = float(dt[3])
   total_time = sum(dt)
   load = 1-(idle_time/total_time)
   return load



def diskspace():
  stats = os.statvfs('/opt')
  freespace = stats.f_bavail * stats.f_frsize
  freespace / 1048576
  return freespace

while True:
  print time.strftime("%A, %B, %d, %Y, %H, %M"),"CPU usage=%.2f%%" % (getCpuLoad()*100) 
  cursor.execute('''INSERT INTO mytable (Date, Cpu) VALUES (?,?)''',(today, getCpuLoad()))
  print time.strftime("%A, %B, %d, %Y, %H, %M"), diskspace()
  cursor.execute('''INSERT INTO mytable (Date, free) VALUES (?,?)''',(today,diskspace())) 

cursor.commit() ご覧のとおり、印刷時に浮動小数点の丸めを行いますが、上記のように、変換せずに挿入するだけです。私はまだ両方を学んでいるので、誰でも助けてください。python と sqlite3.

4

1 に答える 1

0

数値データの場合、SQLlite3は整数(1、2、4、6、または8バイトに格納)または実数(8バイトのIEEE浮動小数点数として格納)のいずれかをサポートします。

Cpu列は、現時点ではREALタイプであるように見えます。この列の値を調べると、小数点以下2桁の適切な数値は表示されません。これは、次の2つの理由によるものです。

  • によって最初に生成された数値は、getCpuLoad()Python浮動小数点演算で許可される最高の精度で計算されました。
  • とにかくround()、ロジックのある時点でその数に達し、この値を検査するために使用するプログラムに応じて、フローティング形式は、一部の値が近似的に見えるようになっています(たとえば 13.5999999、どこに良いと期待するかを示すなど13.6

言い換えるとgetCpuLoad()、の最後の1行を変更して読み取ることができます

  load = round(1-(idle_time/total_time), 2)

つまり、戻り値を小数点以下2桁に丸めますが、これらの値の検査方法によっては、小数点以下2桁で体系的に「見える」とは思わないでください。

ただし、値を明示的に丸めると、データが「均一化」されます。これにより、以前はmytable内の2つの異なるレコードが、たとえば、 12.3456781などの値を持つことができましたが12.3489121、これら2つの値はまったく同じになります12.3512.34999999いくつかのデータベースツールで検査したとき。

あるいは、これらの値を整数として格納することを検討することもできます。暗黙の係数は100です。つまり、 1234の代わりに格納し12.34ます。もちろんそうする場合は、使用または表示するときに値を100で割る必要があります。
さらに別の可能なストレージタイプは、値をSQLite TEXTタイプとして保存することですが、値を変換する必要があるため、これはかなり不便です(ASCIIから数値への変換に関連するすべての処理コストと例外を含む)あなたがそれを必要とするたびに。

結論として、そしてあなたがそのように傾いているなら、あなたは、とりわけ、これらの丸め誤差がなぜ起こるのかを理解するために、DavidGoldbergによる
「すべてのコンピュータ科学者が浮動小数点演算について知っておくべきこと」を読むことができます。

于 2013-03-15T17:52:47.840 に答える