我需要将价格存储在我的房间数据库中。我可以得到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。但没有任何帮助。
答案 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总是会转换为默认小数点后的两倍,而且我总是会得到巨大的价值。
现在对我来说很好。