我有一个String格式的价格,价格可以同时包含小数和整数。 像
String price ="100.00";
String price ="100";
String price ="100.123";
我想以数字(100)或仅以100.23(不是字符串)的形式存储在mongodb中。 由于整数和其他格式的解析器在Java中的处理方式不同,因此是不同的。
答案 0 :(得分:0)
您可以存储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可以采用BigDecimal
或long
的值来构造Decimal128对象。请参考上面的API文档。
请参阅此blog以了解为什么需要Decimal128?
答案 1 :(得分:0)
我认为您可以尝试使用BigDecimal。
您可以在这里阅读: Java best type to hold price
Java的本机浮点类型(float和double)具有与其他编程语言相同的精度问题。我认为您可以从String中创建BigDecimal,可以是long和double。但是正如我说的,您一定不能加倍。请问您是否可以在Mongodb内部寻找一种不损失精度的保存方法,然后将其直接转换为BigDecimal。如果您无法轻松地转换回BigDecimal,请使用String存储在Mongodb中,然后从该String构造BigDecimal。
在这里,我找到了一篇有关此的文章和一篇文章: Spring Data MongoDB BigDecimal support https://www.moschetti.org/rants/mongomoney.html
答案 2 :(得分:0)
TL; DR
STRING
(如果要在客户端上进行算术运算)。 BSON
,如果您希望算术运算在数据库服务器内发生并在响应中接收它。 深度(不多)
这取决于您希望将数字运算放在何处。您始终可以在MongoDB上将定价另存为 String
类型,而不必进行服务器端算法(非数字模型)以及所需小数点的精度。
如果希望从查询本身进行算术运算,则应使用Bson
。在下面留下与mongo有关的官方文档:
数值模型
如果您需要查询数据库以查找精确的,数学上有效的匹配项,或者需要执行服务器端算术,例如$ inc,$ mul和聚合框架算术,则数字模型可能是合适的。
以下方法遵循数字模型:
使用十进制BSON类型,这是一种基于十进制的浮点格式,能够提供精确的精度。在MongoDB 3.4版和更高版本中可用。 使用比例因子乘以10的幂后可以将货币值转换为64位整数(长BSON类型)。
非数字模型
如果不需要对货币数据执行服务器端算术,或者如果服务器端近似值足够,则使用非数字模型对货币数据进行建模可能是合适的。
以下方法遵循非数字模型:
使用两个字段作为货币值:一个字段将确切的货币值存储为非数字字符串,另一个字段存储该值的基于二进制的浮点(双BSON类型)近似值。
编辑:来源:https://docs.mongodb.com/manual/tutorial/model-monetary-data/
答案 3 :(得分:0)
不应使用像 Double 这样的浮点数来存储货币值。舍入错误肯定会发生,因为这些格式的表示并不准确。用于 MongoDB 的正确类型是 Decimal128 类型,因为它存储值的精确表示,并且具有足够的精度来支持所有形式的货币计算。