【问题标题】:Storing currency values in SQLite3在 SQLite3 中存储货币值
【发布时间】:2011-03-16 17:30:30
【问题描述】:

我在我的应用程序中处理许多不同的货币,我想知道将它们存储在 SQLite3 数据库中的“最佳”方式是什么。

我倾向于定点表示(即将它们存储为整数,其中 $3.59 存储为 359,¥400 存储为 40000)。这是一个好主意吗?如果我的输入数据后来发生变化并需要更高的精度怎么办?

【问题讨论】:

    标签: sqlite currency


    【解决方案1】:

    鉴于 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
    

    除非您处理行星际会计,否则我认为您不必担心。

    【讨论】:

    • 好吧,完全准确,这并不能说明所有的可能性:en.wikipedia.org/wiki/…
    • 这里假设定点小数的小数位数总是相同的,但情况可能并非如此。小件商品的价格可能高达 4 或 6 位小数,或者可能由用户定义(例如,它们几乎出现在每一个严肃的 ERP 中——只是举一个现实生活中的例子——)。
    • 作为参考,通过使用 8 个小数位(如比特币),最大可表示的有符号 Int64 为 920 亿 = 92_233_720_368.54775807。如果使用 4 位数字,则为 922 万亿。
    【解决方案2】:

    在财务软件中,货币始终表示为定点数(十进制)。 您可以使用整数在 SQLite 中模拟它(64 位整数最多可容纳 18 位数字)。

    【讨论】:

      【解决方案3】:

      我会说字符串/文本。如果您也需要这样做,您可以随时将其转换为任何文化。

      【讨论】:

      • 将数字数据存储为字符串是愚蠢的,尤其是当有一个完美的数字类型支持用例时。
      • 将固定小数存储为整数意味着您需要将小数位数存储在其他地方。因此,您需要两个字段,一个用于整数,另一个用于小数位数(除非您 100% 确定小数位数始终相同并且不会改变)。所以将它们存储为字符串可能不会那么愚蠢。
      【解决方案4】:

      最佳货币数据类型是 BigDecimal,在 sqlite 中,您可以将其存储为 VARCHAR 字段

      ormlite 在存储时将 BigDecimal 转换为字符串。

      ormlite doc for BigDecimal

      【讨论】:

      • Sqlite 没有 VARCHAR 数据类型。
      【解决方案5】:

      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

      【讨论】:

      • 请不要在多个问题上发帖identical answers。发布一个好的答案,然后投票/标记以关闭其他问题作为重复问题。如果问题不是重复的,调整您对该问题的回答。
      猜你喜欢
      • 2017-11-21
      • 1970-01-01
      • 1970-01-01
      • 2022-08-19
      • 2010-09-14
      • 1970-01-01
      相关资源
      最近更新 更多