我创建了一个简单的 sqlite 表:
private static final String TABLE_CREATE = "CREATE TABLE tab1("
+ "_id INTEGER PRIMARY KEY AUTOINCREMENT, "
+ "amount NUMERIC NOT NULL DEFAULT 0"
+ ");";
db.execSQL(TABLE_CREATE);
但是当我将值插入表中时,它们会四舍五入:
INSERT INTO tab1(amount) VALUES (123456789.12) // Becomes 1.23457e+08
INSERT INTO tab1(amount) VALUES (12345.67) // Becomes 12345.7
INSERT INTO tab1(amount) VALUES (300087.59) // Becomes 300088
INSERT INTO tab1(amount) VALUES (3000001.22) // Becomes 3e+06
如何将完整的数字保存到表中并且仍然能够使用如下查询:
SELECT * FROM tab1 WHERE amount < 0
编辑:
@MikeT 感谢您的建议,我正在使用 Cursor getString 方法。 现在我使用 getDouble 方法,然后转换为 BigDecimal 并四舍五入,它解决了问题。
最佳答案
我认为您的问题在于如何提取值,而不是如何存储它们。
看起来您正在使用 Cursor getString
方法。
尝试改用 Cursor getFloat
或 getDouble
方法。
以下(摘自 How flexible/restricive are SQLite column types? )向您展示了各种 Cursor get????
方法的结果(getBlob
中的异常已被捕获并处理):-
对于 Double myREAL = 213456789.4528791134567890109643534276;
:-
08-08 09:19:03.658 13575-13575/mjt.soqanda D/ColTypes: Column=REAL_COL<<
08-08 09:19:03.658 13575-13575/mjt.soqanda D/ColTypes: VALUE AS INT >>213456789<<
08-08 09:19:03.658 13575-13575/mjt.soqanda D/ColTypes: VALUE AS LONG >>213456789<<
08-08 09:19:03.658 13575-13575/mjt.soqanda D/ColTypes: VALUE AS STRING >>2.13457e+08<<
08-08 09:19:03.658 13575-13575/mjt.soqanda D/ColTypes: VALUE AS DOUBLE >>2.134567894528791E8<<
08-08 09:19:03.658 13575-13575/mjt.soqanda D/ColTypes: VALUE AS FLOAT >>2.1345678E8<<
08-08 09:19:03.658 13575-13575/mjt.soqanda D/ColTypes: VALUE AS SHORT >>6037<<
08-08 09:19:03.658 13575-13575/mjt.soqanda D/ColTypes: Unable to handle with getBlob.
SQlite 在存储值方面非常灵活。简而言之,任何值都可以存储在任何列类型中,并且每一行/列都有自己独特的类型。
您可能希望阅读 Datatypes In SQLite Version 3
关于java - 没有请求的Android sqlite舍入数字,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47421551/