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 类型,当检查此列中的值时,您看不到小数点后正好有两位数的整洁数字。这是因为以下两个原因:

  • 最初产生的数字getCpuLoad()是按照 Python 浮点算法允许的最高精度计算的。
  • 无论如何,即使您round()在逻辑中的某个点达到了该数字,并且取决于您使用哪个程序来检查该值,浮动格式使得某些值仍然看起来是近似的(例如,显示 13.5999999您期望的位置不错13.6

换句话说:你可以修改getCpuLoad()'s last but one line to read

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

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

然而,明确地四舍五入将“统一”您的数据,从某种意义上说,以前 mytable 中的两个不同记录可能具有诸如 12.3456781和之类的值12.3489121,现在这两个值将完全相同,12.35(即使它可能看起来像12.34999999当用一些数据库工具检查时。

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

最后,如果您愿意,您可以阅读David Goldberg 的
“What Every Computer Scientist Should Know About Floating-Point Arithmetic”,以了解为什么会出现这些舍入错误。

于 2013-03-15T17:52:47.840 回答