2013-03-15 77 views
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。

+0

你正在存储的问题是你将'12.34'存储到'mytable.Cpu'中,当你检查它时,你会看到'12.3399921'?顺便说一句mytable的定义是什么? – mjv 2013-03-15 13:53:41

+0

是的,当我检查它返回一个十进制浮点数。mytable只是数据库中表的名称,其中cpu是列 – 2013-03-15 14:05:43

回答

0

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

Cpu列似乎是REAL类型的时刻,并且在检查此列中的值时,您看不到小数点后两位数字整齐的数字。这是由于以下两个原因造成的:

  • 该数字最初由getCpuLoad()产生,计算得到Python浮点运算所允许的最高精度。
  • 无论如何,即使您在逻辑中的某个位置输入了该数字,并根据您使用哪个程序来检查此值,浮动格式仍然会使某些值仍然看起来近似(例如,请在13.5999999处显示13.5999999是期待一个不错的13.6

换句话说:你可以修改getCpuLoad()的倒数第二行改为

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

即返回值四舍五入至小数点后两位数,但是,这取决于你如何检查这些值,做不要指望他们会用小数点后的2位数字来系统地“看”系统。

四舍五入的价值观明确,但将“均匀”你的数据,从某种意义上说,在MYTABLE其中以前两种不同的记录可以像,比如说,12.345678112.3489121值,现在这两个值将是完全一样的,12.35 (尽管它可能看起来12.34999999当一些数据库工具检查。

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

至于结论,如果您如此倾向,您可以阅读David Goldberg的
"What Every Computer Scientist Should Know About Floating-Point Arithmetic"以了解,除其他外,为什么会出现这些舍入误差。