Android开发——SQLite存储 float

标签 android sqlite floating-point

当我在 SQLiteDatabase.insert 中存储浮点值时,存储的值将与原始值不同,见下文:

我有一个数据库宽度:

db.execSQL("CREATE TABLE IF NOT EXISTS info_values ("
    + BaseColumns._ID + " INTEGER PRIMARY KEY AUTOINCREMENT, "
    + "date DATE UNIQUE NOT NULL, "
    + "value REAL NOT NULL)");

当我插入例如 33.3 宽度时:

private class inputdlg_ok implements input_dlg.ReadyListener {
    public void ready(float newvalue) {
      Date d = new Date();
      SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
      ContentValues values = new ContentValues();
      values.put("date", sdf.format(d));
      values.put("value", newvalue);

      database.insert("info_values", null, values);

我有这些:

sqlite> select * from info_values;
83|2012-04-04 09:06:22|33.2999992370605
84|2012-04-02 09:05:57|22.2000007629395

我测试了 width exec:

 String sql = "INSERT INTO info_values (date, value) " + 
              "VALUES ('" + sdf.format(d) + "'," + Float.toString(newvalue) + ")";
database.execSQL(sql);

而且这种形式效果很好。

有什么想法吗?

最佳答案

从没想过这个帖子会对其他人有帮助,但还是在这里 goes .

基本上,您的问题是您使用 float 作为 java 代码中的类型。 Float 的精度非常低。阅读我链接到的线程,以及所有评论和链接的聊天。如果您仍有任何问题,请回信。

您可能知道 double 值在计算机中的存储精度只有一定的限度。尽管这些值在数据库中看起来很奇怪,但这是使用 float 时可以获得的最佳值近似值。使用 double 可以提高精度,但永远无法达到完美状态。如果您坚持要获得精确值,那么限制数据库中的实际大小可能是一种可行的方法。

编辑 因为我无法让您相信这是一个精度问题,所以我包含了以下程序:

float f = 22.2;
printf("The number is: %.9f\n", f);

输出是:

22.200000763

我建议你试试。如您所见,这正是您指出的数字。

关于Android开发——SQLite存储 float ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10153809/

相关文章:

java - Android 将文件写入不同的应用程序文件夹

floating-point - SIGFPE : Floating-point exception backtrace for this error: 0x7F70C71AF7D7

C#:从 IntPtr 转换为 float 时 Marshal.Copy() 访问冲突

OpenGL纹理坐标和小 float 的精度

java - 如何使用 Here Android SDK 将 SVG 图标设置为 HERE map 上的 map 标记

android - 在没有响铃的情况下以编程方式拒绝调用

Android:将外部文件和文件夹存储为 Assets ?资源?还有别的吗?

sqlite - 无法使 ServiceStack.OrmLite.Sqlite64 示例正常工作

android - 插入的行 ID 大于表中的所有条目

sqlite - FMDB Swift SQL 获取表中的行数