将转换百分比插入数据库

时间:2013-03-15 13:41:00

标签: python sqlite

我对这篇文章的目标是将打印值放到数据库中但是从终端查询时数据库返回浮点而不是打印值是否有办法强制将其传递给数据库。 这是我的代码

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。

1 个答案:

答案 0 :(得分:0)

对于数字数据,SQLlite3支持整数(存储在1,2,4,6或8字节)或real(存储为8字节IEEE floating point number)。

Cpu列似乎是REAL类型,当检查此列中的值时,您看不到小数点后正好两位数的整数。这是因为以下两个原因:

  • 最初由getCpuLoad()生成的数字是按Python浮点算法允许的最大精度计算的。
  • 无论如何,即使您在逻辑中的某个点上round()该数字,并且根据您使用哪个程序来检查此值,浮动格式仍然是某些值看起来仍然近似(例如,显示{ {1}}你期待一个不错的13.5999999

换句话说:你可以修改13.6的最后一行,但要读一行

getCpuLoad()

即。将返回值四舍五入为两位小数,但是,根据您检查这些值的方式,不要指望它们在系统上“看”2小数点后正好2位数。

明确地舍入值,但是会使数据“统一”,从某种意义上说mytable中以前的两个不同记录可能具有 load = round(1-(idle_time/total_time), 2) 12.3456781之类的值,现在这两个值将完全相同,12.3489121(即使在使用某些数据库工具进行检查时它可能看起来像12.35

或者,您可以考虑将这些值存储为整数,隐含因子为100,即存储,例如12.34999999代替1234。如果这样做,当然在使用或显示时需要将值除以100 另一种可能的存储类型是将值存储为SQLite TEXT类型,但这会非常不方便,因为您需要转换该值(包括所有处理成本和与ASCII到数字转换相关的异常)每次你需要它。

至于结论,如果你如此倾向,你可以阅读
大卫·戈德伯格(David Goldberg)"What Every Computer Scientist Should Know About Floating-Point Arithmetic"除其他外,了解为什么会出现这些舍入错误。