2013-03-15 30 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"以瞭解,除其他外,爲什麼會出現這些舍入誤差。