在SQLite中存储浮点值会更改Room DB中的小数精度

时间:2018-02-27 07:00:53

标签: android sqlite android-sqlite android-room

我需要将价格存储在我的房间数据库中。我可以得到2位小数或3位小数的小数精度,具体取决于我的应用程序所在的国家/地区。

使用android的房间库在sqlite数据库中存储float或甚至double值时,它会更改值。例如: 14.54存储为14.539999961853

调试时,我只能在传递给插入的列表中找到值为14.54。但是从Windows的SQLite浏览器应用程序中检查已保存的记录。我看到价值观发生了变化。我使用sqlite浏览器手动输入了一个查询,值保存原样(浮点值不改变精度)。例如:

LocationChanged

上述查询成功执行并插入14.54的浮点数

但在android中使用以下

private void AgentMainForm_LocationChanged(object sender, EventArgs e)
{
      Console.WriteLine("bounds: {0}, {1}", Bounds.Width, Bounds.Height);
      Console.WriteLine("Size: {0}, {1}", Size.Width, Size.Height);
      Console.WriteLine("Window Rect: {0}, {1}", GetSizeWithShadow().Width, GetSizeWithShadow().Height);
      Console.WriteLine("Window Rect: {0}, {1}", GetSizeWithoutShadow().Width, GetSizeWithoutShadow().Height);
}

[DllImport("user32.dll", SetLastError = true)]
public static extern bool GetWindowRect(IntPtr hwnd, out RECT lpRect);

[DllImport("dwmapi.dll")]
public static extern int DwmGetWindowAttribute(IntPtr hwnd, int dwAttribute, out RECT pvAttribute, int cbAttribute);

public Size GetSizeWithoutShadow()
{
      RECT regionWithoutShadow;
      IntPtr hWnd = this.Handle;
      if (Environment.OSVersion.Version.Major < 6) //DwmGetWindowAttribute does not work in XP, compatible only from Vista
      {
            GetWindowRect(hWnd, out regionWithoutShadow);
      }
      else
      {
            if (DwmGetWindowAttribute(hWnd, DWMWA_EXTENDED_FRAME_BOUNDS, out regionWithoutShadow, Marshal.SizeOf(typeof(RECT))) != 0)
            {
                 //Handle for failure
            }
      }

      return new Size(regionWithoutShadow.right - regionWithoutShadow.left, regionWithoutShadow.bottom - regionWithoutShadow.top);
}

public Size GetSizeWithShadow()
{
     RECT regionWithoutShadow;
     IntPtr hWnd = this.Handle;

     GetWindowRect(hWnd, out regionWithoutShadow);

     return new Size(regionWithoutShadow.right - regionWithoutShadow.left, regionWithoutShadow.bottom - regionWithoutShadow.top);
}

[StructLayout(LayoutKind.Sequential)]
public struct RECT
{
    public int left;
    public int top;
    public int right;
    public int bottom;
}

MyTable实体的字段为

("INSERT INTO MYTABLE (ItemPrice) VALUES (14.54)");
插入上述查询时

值已更改

我也尝试将DB Schema中的数据类型更改为real,float,double。但没有任何帮助。

1 个答案:

答案 0 :(得分:0)

我的代码中有浮点数,并且在db模式中,它是double(尽管dotnt表示任何意思)

但是我做了以下事情: 1.在代码和db中使用相同的数据类型(我使用double表示精度) 2.在存储值的同时。我根据需要四舍五入。

public static short COUNTRY_CURRENCY_MAX_DIGITS_AFTER_DECIMAL;//Dynamically set
private static int ROUNDING_MODE = BigDecimal.ROUND_HALF_EVEN;

public double roundedDouble(double doubleValue) {
    return new 
BigDecimal(doubleValue).setScale(COUNTRY_CURRENCY_MAX_DIGITS_AFTER_DECIMAL, 
ROUNDING_MODE).doubleValue();
}

3。根据我在COUNTRY_CURRENCY_MAX_DIGITS_AFTER_DECIMAL变量中设置的内容,上述方法将为我返回带2或3个小数的小数。 4.最后,我将值存储在数据库中。

Ps:如果没有上述方法,我的float总是会转换为默认小数点后的两倍,而且我总是会得到巨大的价值。

现在对我来说很好。