【问题标题】:How to store price in Mongodb如何在MongoDB中存储价格
【发布时间】:2021-07-04 16:06:17
【问题描述】:

我有一个字符串格式的价格,价格可以包含小数和整数。 喜欢

String price ="100.00";
String price ="100";
String price ="100.123";

我想将它存储在 mongodb 中,作为数字(100)或只是 100.23(不是字符串)。 如何在 java 中处理这个问题,因为 Integer 和其他格式的解析器不同。

【问题讨论】:

  • 应该存储为双BSON类型。等效的 java 类是 java.lang.Double。

标签: java mongodb


【解决方案1】:

不应使用 Double 等浮点数存储货币值。舍入错误肯定会发生,因为这些格式的表示并不准确。用于 MongoDB 的正确类型是 Decimal128 类型,因为它存储值的精确表示,并且具有足够的精度来支持所有形式的货币计算。

【讨论】:

    【解决方案2】:

    您可以存储Double BSON 类型来存储价格值。如果价格值为100,则可以存储为100.00

    等效的 Java 类型是 java.lang.Double

    BSON to Java data type mapping

    整数值可以在 Java 中转换为双精度值。一些示例代码:-

    new Double(100);
    int i = 100;
    new Double(i);
    Integer i1 = 100;
    new Double(i1);
    double d1 = (double) i;
    

    从 3.4 版本开始有一个新的Decimal128 BSON data type

    Java API 可以采用 BigDecimallong 值来构造 Decimal128 对象。请参考上述 API 文档。

    请参阅此blog 以了解为什么需要 Decimal128?

    Floating point arithmetic accuracy problems

    【讨论】:

      【解决方案3】:

      我认为你可以尝试使用 BigDecimal。

      您可以在这里阅读: Java best type to hold price

      Java 的本机浮点类型(float 和 double)与其他编程语言一样存在精度问题。我认为您可以从 String、long 和 double 制作 BigDecimal。但正如我所说,你不能加倍。请您搜索一种在不丢失 Mongodb 内部精度的情况下保存的方法,然后直接将其转换为 BigDecimal。如果您无法轻松转换回 BigDecimal,请使用 String 存储在 Mongodb 中,然后从该 String 构造 BigDecimal。

      在这里我找到了一篇关于此的帖子和一篇文章: Spring Data MongoDB BigDecimal support https://www.moschetti.org/rants/mongomoney.html

      【讨论】:

      • 我从未这样做过,但例如,您可以阅读有关与 org.bson.types.Decimal128 之间的转换
      【解决方案4】:

      TL;DR

      • STRING 如果你想在客户端进行算术运算。
      • BSON 如果您希望算法在数据库服务器中发生并在响应中接收它。

      深入(没那么多)

      这取决于您希望将数字运算放在哪里。您始终可以将定价保存为 MongoDB 上的 String 类型,始终不需要进行 服务器端 算术(非数字模型)和您需要的小数精度。

      如果您希望从查询本身进行算术运算,您应该使用Bson。下面留给你官方的 mongo 相关文档:

      数值模型

      如果您需要查询数据库以获得精确的、数学上有效的匹配,或者需要执行服务器端算术,例如 $inc、$mul 和聚合框架算术,则数值模型可能是合适的。

      以下方法遵循数值模型:

      使用 Decimal BSON 类型,这是一种基于十进制的浮点格式,能够提供精确的精度。在 MongoDB 版本 3.4 及更高版本中可用。 使用比例因子通过乘以 10 比例因子的幂将货币值转换为 64 位整数(长 BSON 类型)。

      非数值模型

      如果不需要对货币数据执行服务器端算术运算,或者如果服务器端近似值足够,则使用非数字模型对货币数据进行建模可能是合适的。

      以下方法遵循非数字模型:

      对货币值使用两个字段:一个字段将确切的货币值存储为非数字字符串,另一个字段存储基于二进制的浮点(双 BSON 类型)近似值。

      编辑:来源:https://docs.mongodb.com/manual/tutorial/model-monetary-data/

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2019-09-16
        • 2012-10-29
        • 2022-01-21
        • 2011-04-22
        • 1970-01-01
        • 2015-04-21
        • 2016-12-05
        相关资源
        最近更新 更多