【发布时间】:2011-03-16 17:30:30
【问题描述】:
我在我的应用程序中处理许多不同的货币,我想知道将它们存储在 SQLite3 数据库中的“最佳”方式是什么。
我倾向于定点表示(即将它们存储为整数,其中 $3.59 存储为 359,¥400 存储为 40000)。这是一个好主意吗?如果我的输入数据后来发生变化并需要更高的精度怎么办?
【问题讨论】:
我在我的应用程序中处理许多不同的货币,我想知道将它们存储在 SQLite3 数据库中的“最佳”方式是什么。
我倾向于定点表示(即将它们存储为整数,其中 $3.59 存储为 359,¥400 存储为 40000)。这是一个好主意吗?如果我的输入数据后来发生变化并需要更高的精度怎么办?
【问题讨论】:
鉴于 SQLite 3 将使用多达 8 个字节来存储 INTEGER 类型,除非您的数字大于 10^16,否则应该没问题。
从这个角度来看,以千分之一美元(一磨坊)表示的世界国内生产总值约为 61'000'000'000'000'000,sqlite3 表示没有问题。
sqlite> create table gdp (planet string, mills integer);
sqlite> insert into gdp (planet, mills) values ('earth', 61000000000000000000);
sqlite> select * from gdp;
earth|61000000000000000000
除非您处理行星际会计,否则我认为您不必担心。
【讨论】:
在财务软件中,货币始终表示为定点数(十进制)。 您可以使用整数在 SQLite 中模拟它(64 位整数最多可容纳 18 位数字)。
【讨论】:
我会说字符串/文本。如果您也需要这样做,您可以随时将其转换为任何文化。
【讨论】:
最佳货币数据类型是 BigDecimal,在 sqlite 中,您可以将其存储为 VARCHAR 字段
ormlite 在存储时将 BigDecimal 转换为字符串。
【讨论】:
SQLite 没有 BigDecimal 字段 所以我使用 SQLite Integer 类型并像这样转换: BigDecimal bd = new BigDecimal("1234.5678"); int packedInt = bd.scaleByPowerOfTen(4).intValue(); // 现在packedInt = 12345678 现在将 packedInt 保存到 SQLite Integer 字段。 回到 BigDecimal: BigDecimal bd = new BigDecimal(packedInt); // bd = 12345678 bd = bd.scaleByPowerOfTen(-4); // 现在 bd = 1234.5678
【讨论】: