可能是我的问题很愚蠢,但是我没有找到任何解决方案。实际上,我想存储大笔价格,即 9999999999.99在Sqlite数据库中并希望将其取回。我尝试使用TEXT,DOUBLE,REAL,LONG数据类型。不幸的是,当我这样做时,它返回了我不需要的值,即9.999999999。如果您对此有解决方案,请提出建议或指导我。 最佳答案 定义的列类型相似性TEXT,REAL,NUMERIC,VARCHAR,RUMPLESTILTSKIN(是可行的)几乎没有影响;唯一的例外是类型是INTEGER PRIMARY KEY还是INTEGER PRIMARY KEY AUTOINCREMENT,在这种情况下,该列是SQLITE列rowid的别名,无法使用。 ROWIDs and the INTEGER PRIMARY KEY基本上,除rowid外,任何列都可以按以下方式存储任何类型的值 SQLite版本3数据库中的任何列,但INTEGER PRIMARY除外 KEY列可用于存储任何存储类的值。 Datatypes In SQLite Version 3 该链接还说明了如何将列类型转换为5种列类型之一:文本,整数,真实,BLOB或数字。RuMpleStilskin(不区分大小写)将按照以下方式转换为NUMERIC:(a)不包含INT(如果这样的话,则为INTEGER关联)(b)它不包含TEXT,CHAR或CLOB(如果这样的话,TEXT亲缘关系,除非事先处理过)(c)它不包含BLOB(如果这样的话,则BLOB亲和力除非事先处理)(d)它不包含REAL,FLOA或DOUB(如果这样,除非事先处理,否则REAL亲和性)(e)如果以上NUMERIC 最重要的是如何检索数据,尽管列的相似性会影响按照以下方式存储数据的方式(存储类): 具有TEXT关联性的列使用存储类存储所有数据 NULL,TEXT或BLOB。如果将数值数据插入到带有 TEXT关联性在存储之前会转换为文本形式。 具有NUMERIC关联性的列可能包含使用全部五个值 存储类。将文本数据插入NUMERIC列时, 文本的存储类将转换为INTEGER或REAL(按 偏好),如果这种转换是无损且可逆的。对于 SQLite认为TEXT和REAL存储类之间的转换 如果前15个转化是无损且可逆的, 保留数字的有效十进制数字。如果 不可能将TEXT无损转换为INTEGER或REAL 该值使用TEXT存储类存储。没有尝试 转换NULL或BLOB值。 字符串可能看起来像带小数点的浮点文字 和/或指数表示法,但只要该值可以表示为 整数,NUMERIC关联会将其转换为整数。 因此,字符串“ 3.0e + 5”存储在具有NUMERIC关联性的列中 为整数300000,而不是浮点值300000.0。 使用INTEGER相似性的列的行为与 NUMERIC关联。 INTEGER和NUMERIC相关性之间的区别 仅在CAST表达式中可见。 具有REAL亲和力的列的行为类似于具有NUMERIC的列 亲和力,不同之处在于它将整数值强制为浮点 表示。 (作为内部优化,浮点较小 没有小数部分的值,并使用REAL存储在列中 亲和力以整数形式写入磁盘,以减少占用 空间,并自动转换回浮点作为 值被读出。这种优化是完全看不见的 SQL级别,只能通过检查SQL的原始位来检测 数据库文件。) 具有亲和力BLOB的列不喜欢一个存储类 另一个,并且没有尝试强制一个存储类中的数据 变成另一个。 Datatypes In SQLite Version 3 对于浮点数或双精度数,应该使用Cursor方法getFloat或getDouble检索数据,然后将结果格式化(如果将其转换为字符串)。注意!假设使用double或float的精度缺陷/损失不相关。如果将值存储为字符串,并且列亲和力是TEXT或BLOB,则结果是无损失的,并且可能是存储大(请参阅结果确定大)数字的最佳方法。考虑一个具有5个列的表,这些表定义了列类型/亲和力REAL,TEXT,INTEGER,NUMERIC和BLOB按照 :-CREATE TABLE prices ( _id INTEGER PRIMARY KEY, PRICE1 REAL, PRICE2 TEXT, PRICE3 INTEGER, PRICE4 NUMERIC, PRICE5 BLOB)ID列不重要。现在考虑这3种基本方法-a)在所有5个PRICE中插入一个双精度值?列-b)在所有5个PRICE中插入一个字符串值?列-c)获取所有行作为游标:-public void insertRowFromDouble(double price) { ContentValues cv = new ContentValues(); cv.put(PRICES_PRICE1_COL,price); cv.put(PRICES_PRICE2_COL,price); cv.put(PRICES_PRICE3_COL,price); cv.put(PRICES_PRICE4_COl,price); cv.put(PRICES_PRICE5_COL,price); mDB.insert(TBNAME,null,cv);}public void insertRowFromString(String price) { ContentValues cv = new ContentValues(); cv.put(PRICES_PRICE1_COL,price); cv.put(PRICES_PRICE2_COL,price); cv.put(PRICES_PRICE3_COL,price); cv.put(PRICES_PRICE4_COl,price); cv.put(PRICES_PRICE5_COL,price); mDB.insert(TBNAME,null,cv);}public Cursor getAllRows() { return mDB.query(TBNAME,null,null,null,null,null,null);}然后考虑以下代码:a)创建一个DecimalFormatb)实例化一个数据库助手c)删除所有现有行(出于可重新运行性考虑)d)使用insertRowfromDouble方法插入5行,这些行具有不同的值,即使每行具有不同的列类型,每行也将全部5列填充为相同的值。e)与d)相同,但是使用insertRowFromString方法,并且使用不同但接近的值。f)获得所有10行的游标。g)使用按照getDouble格式化的DecimalFormat方法然后通过getString方法循环遍历光标,输出结果数据。:- final DecimalFormat df = new DecimalFormat("#0.000000"); mDBPricesHlpr = new PriceDBHelper(this); mDBPricesHlpr.getWritableDatabase().delete(PriceDBHelper.TBNAME,null,null); mDBPricesHlpr.insertRowFromDouble(999999999999999999999999999999999999999.99); mDBPricesHlpr.insertRowFromDouble(12345678901.123456); mDBPricesHlpr.insertRowFromDouble(9999999999.99); mDBPricesHlpr.insertRowFromDouble(0.01); mDBPricesHlpr.insertRowFromDouble(45678.45); mDBPricesHlpr.insertRowFromString("999999999999999999999999999999999999999999999999999999999999999999999999999.99"); mDBPricesHlpr.insertRowFromString("12345678901.123456"); mDBPricesHlpr.insertRowFromString("8888888888.88"); mDBPricesHlpr.insertRowFromString("0.02"); mDBPricesHlpr.insertRowFromString("56789.56"); Cursor csr = mDBPricesHlpr.getAllRows(); while (csr.moveToNext()) { Log.d("PRICEINFO_GETDBL"," Processing Row " + csr.getPosition() + "\n\tPRICE1=" + df.format(csr.getDouble(csr.getColumnIndex(PriceDBHelper.PRICES_PRICE1_COL))) + "\n\tPRICE2=" + df.format(csr.getDouble(csr.getColumnIndex(PriceDBHelper.PRICES_PRICE2_COL))) + "\n\tPRICE3=" + df.format(csr.getDouble(csr.getColumnIndex(PriceDBHelper.PRICES_PRICE3_COL))) + "\n\tPRICE4=" + df.format(csr.getDouble(csr.getColumnIndex(PriceDBHelper.PRICES_PRICE4_COl))) + "\n\tPRICE5=" + df.format(csr.getDouble(csr.getColumnIndex(PriceDBHelper.PRICES_PRICE5_COL))) ); Log.d("PRICEINFO_GETSTR", " Processing Row " + csr.getPosition() + "\n\tPRICE1=" + csr.getString(csr.getColumnIndex(PriceDBHelper.PRICES_PRICE1_COL)) + "\n\tPRICE2=" + csr.getString(csr.getColumnIndex(PriceDBHelper.PRICES_PRICE2_COL)) + "\n\tPRICE3=" + csr.getString(csr.getColumnIndex(PriceDBHelper.PRICES_PRICE3_COL)) + "\n\tPRICE4=" + csr.getString(csr.getColumnIndex(PriceDBHelper.PRICES_PRICE4_COl)) + "\n\tPRICE5=" + csr.getString(csr.getColumnIndex(PriceDBHelper.PRICES_PRICE5_COL)) ); }结果输出为:01-11 10:39:30.626 3680-3680/? D/PRICEINFO_GETDBL: Processing Row 0 PRICE1=1000000000000000000000000000000000000000.000000 PRICE2=1000000000000000000000000000000000000000.000000 PRICE3=1000000000000000000000000000000000000000.000000 PRICE4=1000000000000000000000000000000000000000.000000 PRICE5=1000000000000000000000000000000000000000.00000001-11 10:39:30.626 3680-3680/? D/PRICEINFO_GETSTR: Processing Row 0 PRICE1=1e+39 PRICE2=1.0e+39 PRICE3=1e+39 PRICE4=1e+39 PRICE5=1e+3901-11 10:39:30.626 3680-3680/? D/PRICEINFO_GETDBL: Processing Row 1 PRICE1=12345678901.123500 PRICE2=12345678901.123500 PRICE3=12345678901.123500 PRICE4=12345678901.123500 PRICE5=12345678901.12350001-11 10:39:30.626 3680-3680/? D/PRICEINFO_GETSTR: Processing Row 1 PRICE1=1.23457e+10 PRICE2=12345678901.1235 PRICE3=1.23457e+10 PRICE4=1.23457e+10 PRICE5=1.23457e+1001-11 10:39:30.626 3680-3680/? D/PRICEINFO_GETDBL: Processing Row 2 PRICE1=9999999999.990000 PRICE2=9999999999.990000 PRICE3=9999999999.990000 PRICE4=9999999999.990000 PRICE5=9999999999.99000001-11 10:39:30.626 3680-3680/? D/PRICEINFO_GETSTR: Processing Row 2 PRICE1=1e+10 PRICE2=9999999999.99 PRICE3=1e+10 PRICE4=1e+10 PRICE5=1e+1001-11 10:39:30.626 3680-3680/? D/PRICEINFO_GETDBL: Processing Row 3 PRICE1=0.010000 PRICE2=0.010000 PRICE3=0.010000 PRICE4=0.010000 PRICE5=0.01000001-11 10:39:30.630 3680-3680/? D/PRICEINFO_GETSTR: Processing Row 3 PRICE1=0.01 PRICE2=0.01 PRICE3=0.01 PRICE4=0.01 PRICE5=0.0101-11 10:39:30.630 3680-3680/? D/PRICEINFO_GETDBL: Processing Row 4 PRICE1=45678.450000 PRICE2=45678.450000 PRICE3=45678.450000 PRICE4=45678.450000 PRICE5=45678.45000001-11 10:39:30.630 3680-3680/? D/PRICEINFO_GETSTR: Processing Row 4 PRICE1=45678.4 PRICE2=45678.45 PRICE3=45678.4 PRICE4=45678.4 PRICE5=45678.401-11 10:39:30.630 3680-3680/? D/PRICEINFO_GETDBL: Processing Row 5 PRICE1=1000000000000000000000000000000000000000000000000000000000000000000000000000.000000 PRICE2=1000000000000000000000000000000000000000000000000000000000000000000000000000.000000 PRICE3=1000000000000000000000000000000000000000000000000000000000000000000000000000.000000 PRICE4=1000000000000000000000000000000000000000000000000000000000000000000000000000.000000 PRICE5=1000000000000000000000000000000000000000000000000000000000000000000000000000.00000001-11 10:39:30.630 3680-3680/? D/PRICEINFO_GETSTR: Processing Row 5 PRICE1=1e+75 PRICE2=999999999999999999999999999999999999999999999999999999999999999999999999999.99 PRICE3=1e+75 PRICE4=1e+75 PRICE5=999999999999999999999999999999999999999999999999999999999999999999999999999.9901-11 10:39:30.630 3680-3680/? D/PRICEINFO_GETDBL: Processing Row 6 PRICE1=12345678901.123500 PRICE2=12345678901.123500 PRICE3=12345678901.123500 PRICE4=12345678901.123500 PRICE5=12345678901.12350001-11 10:39:30.630 3680-3680/? D/PRICEINFO_GETSTR: Processing Row 6 PRICE1=1.23457e+10 PRICE2=12345678901.123456 PRICE3=1.23457e+10 PRICE4=1.23457e+10 PRICE5=12345678901.12345601-11 10:39:30.630 3680-3680/? D/PRICEINFO_GETDBL: Processing Row 7 PRICE1=8888888888.880000 PRICE2=8888888888.880000 PRICE3=8888888888.880000 PRICE4=8888888888.880000 PRICE5=8888888888.88000001-11 10:39:30.630 3680-3680/? D/PRICEINFO_GETSTR: Processing Row 7 PRICE1=8.88889e+09 PRICE2=8888888888.88 PRICE3=8.88889e+09 PRICE4=8.88889e+09 PRICE5=8888888888.8801-11 10:39:30.630 3680-3680/? D/PRICEINFO_GETDBL: Processing Row 8 PRICE1=0.020000 PRICE2=0.020000 PRICE3=0.020000 PRICE4=0.020000 PRICE5=0.02000001-11 10:39:30.634 3680-3680/? D/PRICEINFO_GETSTR: Processing Row 8 PRICE1=0.02 PRICE2=0.02 PRICE3=0.02 PRICE4=0.02 PRICE5=0.0201-11 10:39:30.634 3680-3680/? D/PRICEINFO_GETDBL: Processing Row 9 PRICE1=56789.560000 PRICE2=56789.560000 PRICE3=56789.560000 PRICE4=56789.560000 PRICE5=56789.56000001-11 10:39:30.634 3680-3680/? D/PRICEINFO_GETSTR: Processing Row 9 PRICE1=56789.6 PRICE2=56789.56 PRICE3=56789.6 PRICE4=56789.6 PRICE5=56789.56所以:-对于使用getDouble的第0行(通过双精度存储的999999999999999999999999999999999999.99),列类型是微不足道的,但对于getString,当列类型为TEXT时会有细微的差别。但是,精度会失去价值(请参见上面的注意事项)。对于第1行(通过双精度存储的12345678901.123500),getDouble可以用于15个有效数字。使用getString时,除TEXT列之外的所有列都会由于精度损失而丢失。对于第2行(通过双精度存储的9999999999.99)与第1行几乎相同。对于第3行(通过双精度存储0.01),可以。对于第4行(通过double存储的45678.45),getString的精度损失是一个问题,除非它是TEXT列。对于第5-9行,数据通过字符串存储,TEXT和BLOB列在所有情况下均精确存储该值,而没有精度损失。否则结果是相似的。关于android - 将大价格值与小数点一起存储在SQLite数据库中,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/48201462/ 10-11 22:17