如何在Mongodb中存储价格

9fkzdhlc  于 2023-10-16  发布在  Go
关注(0)|答案(5)|浏览(170)

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

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

我想把它存储在mongodb中,作为number(100)或100.23(不是string)。如何在java中处理这一点,因为解析器对于XML和其他格式是不同的。

o2gm4chl

o2gm4chl1#

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

vpfxa7rd

vpfxa7rd2#

您可以存储Double BSON类型来存储价格值。如果价格值为100,则可以存储为100.00
Java的类型是java.lang.Double
BSON to Java data type mapping
在Java中,整数值可以转换为double。示例代码:

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以理解为什么需要十进制128?
浮点运算精度问题

pxy2qtax

pxy2qtax3#

我想你可以试试大Decorative。
你可以在这里阅读:Java best type to hold price
Java的原生浮点类型(float和double)与其他编程语言一样存在精度问题。我认为你可以从String,long和double中创建BigDecimal。但正如我所说的,你不能去加倍。请你在Mongodb中搜索一种方法来保存而不丢失精度,然后直接将其转换为BigDeclare。如果你不能将easy转换回BigDecorate,请使用String存储在Mongodb中,然后从这个String构造BigDecorate。
在这里我找到了一个帖子和一篇关于这个的文章:Spring Data MongoDB BigDecimal supporthttps://www.moschetti.org/rants/mongomoney.html

2wnc66cl

2wnc66cl4#

TL;DR

  • STRING如果你想在客户端进行算术运算。
  • BSON,如果你想在数据库服务器中进行运算,并在响应中接收它。
    In depth(not that much)

这取决于你想把你的数值运算放在哪里。你可以在MongoDB上保存定价为**String类型,你不需要做服务器端**算术(非数值模型)和你需要的小数精度。
如果你想从查询本身进行算术运算,你应该使用Bson。下面是Mongo相关的官方文档:

数值模型

如果您需要查询数据库以获得精确的、数学上有效的匹配,或者需要执行服务器端算法(例如,$inc、$穆尔和聚合框架算法),则数字模型可能是合适的。
以下方法遵循数值模型:
使用DecorabBSON类型,这是一种基于十进制的浮点格式,能够提供精确的精度。在MongoDB 3.4及更高版本中可用。使用比例因子通过乘以10的幂比例因子将货币值转换为64位整数(长BSON类型)。

非数字型号

如果不需要对货币数据执行服务器端算术,或者如果服务器端近似就足够了,则使用非数值模型对货币数据进行建模可能是合适的。
以下方法遵循非数值模型:
使用两个字段表示货币值:一个字段将精确的货币值存储为非数字字符串,另一个字段存储该值的基于二进制的浮点(双BSON类型)近似值。
编辑:来源:https://docs.mongodb.com/manual/tutorial/model-monetary-data/

67up9zun

67up9zun5#

对于Number类型,MongoDB服务器会自动将Int32设置为数据类型

相关问题