2013-04-26 20 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