2013-04-26 26 views
0

我正在使用實型來保存SQLite數據庫中的價格值,但它沒有正確返回值。如果我保存一些值,如1.01它將返回4.029999999999999。 我已經讀過,在SQLite中節省價格的最佳方式是使用整數​​SQLite如何使用整數來存儲價格值

但我不知道如何使用它。 如何在這種情況下存儲和檢索價格? 下面的代碼我現在該怎麼找回價格:

Cursor cursor = null; 
    double totalPrice = 0; 
    try { 
     cursor = mDB.rawQuery("select " + Expense.PRICE + " from " + Expense.TABLE_NAME + " where " + " (strftime(" 
       + dateType + ", " + Expense.DATE + "))" + "= ? ", new String[] { currentDate }); 

    } catch (Exception e) { 
     Log.e(TAG, "error" + e.toString()); 
     e.printStackTrace(); 
    } 
    for (cursor.moveToFirst(); !cursor.isAfterLast(); cursor.moveToNext()) { 
     totalPrice += cursor.getDouble(cursor.getColumnIndex(Expense.PRICE)); 
    } 
+1

首先,停止構建你的SQL。改用參數化的SQL。接下來,不要使用'double'作爲價格信息:如果需要,可以將其作爲整數存儲,但可以*將其作爲整數檢索,也可以將其轉換爲BigDecimal。 – 2013-04-26 11:51:00

+1

顯然,如果您需要超過1分的精度,您必須將存儲的值乘以100,甚至更多。 – stivlo 2013-04-26 11:52:43

+0

感謝有關SQL請求的建議。 – 2013-04-26 11:53:32

回答

7

當你看到它其實原因很簡單。

我不知道你在用什麼貨幣,而是假設爲美元。

你想存儲1.01美元。這與101美分相同。你只需乘以100

所以存儲在號碼前,通過100 乘以當100


顯示數字,鴻溝只是爲了添加到答案:我也想你應該存儲內存中的數字也是美分/整數。因此,對於您的所有工作,計算等,請使用該整數格式。

如果用戶輸入$金額,將其直接轉換爲整數(乘以100)。只有當你需要顯示它時才變回$。

換句話說,不只是去往和來自數據庫。

+1

謝謝,這很簡單,我認爲這很難做! – 2013-04-26 11:56:40

+0

很高興我能幫到你。在你的編程生涯中很早就學到了一個很好的教訓,並且有很多關於這個的博客文章,以及什麼是「最好」的方法是...祝你好運。 – 2013-04-26 12:00:49

1

有效的Java書在條款48中描述瞭如果需要精確的答案,則不應該使用float或double。

我認爲您應該使用長期價值來存儲價格價值,但將價值存儲在「美分」(或等同於每種貨幣的選擇)而不是「美元」。這樣你的數學價格應該可以正常工作,不會因浮點運算而損失。

+0

事實上,他應該使用很長時間,特別是因爲他丟失了兩個無花果。 – 2013-04-26 12:03:12

+0

同意。謝謝,我更新了上面的答案。 – 2013-04-26 12:11:04

相關問題