我有一个字符串格式的价格,价格可以包含小数和整数。像
String price ="100.00"; String price ="100"; String price ="100.123";
我想把它存储在mongodb中,作为number(100)或100.23(不是string)。如何在java中处理这一点,因为解析器对于XML和其他格式是不同的。
o2gm4chl1#
货币值不应使用浮点数(如Double)存储。舍入错误肯定会发生,因为这些格式在其表示中并不精确。适合MongoDB使用的类型是Decimal128类型,因为它存储了值的精确表示,并且具有足够的精度来支持所有形式的货币计算。
vpfxa7rd2#
您可以存储Double BSON类型来存储价格值。如果价格值为100,则可以存储为100.00。Java的类型是java.lang.Double。BSON to Java data type mapping在Java中,整数值可以转换为double。示例代码:
Double
100.00
java.lang.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以理解为什么需要十进制128?浮点运算精度问题
BigDecimal
long
pxy2qtax3#
我想你可以试试大Decorative。你可以在这里阅读:Java best type to hold priceJava的原生浮点类型(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
2wnc66cl4#
TL;DR
STRING
BSON
这取决于你想把你的数值运算放在哪里。你可以在MongoDB上保存定价为**String类型,你不需要做服务器端**算术(非数值模型)和你需要的小数精度。如果你想从查询本身进行算术运算,你应该使用Bson。下面是Mongo相关的官方文档:
String
Bson
数值模型
如果您需要查询数据库以获得精确的、数学上有效的匹配,或者需要执行服务器端算法(例如,$inc、$穆尔和聚合框架算法),则数字模型可能是合适的。以下方法遵循数值模型:使用DecorabBSON类型,这是一种基于十进制的浮点格式,能够提供精确的精度。在MongoDB 3.4及更高版本中可用。使用比例因子通过乘以10的幂比例因子将货币值转换为64位整数(长BSON类型)。
非数字型号
如果不需要对货币数据执行服务器端算术,或者如果服务器端近似就足够了,则使用非数值模型对货币数据进行建模可能是合适的。以下方法遵循非数值模型:使用两个字段表示货币值:一个字段将精确的货币值存储为非数字字符串,另一个字段存储该值的基于二进制的浮点(双BSON类型)近似值。编辑:来源:https://docs.mongodb.com/manual/tutorial/model-monetary-data/
67up9zun5#
对于Number类型,MongoDB服务器会自动将Int32设置为数据类型
Number
Int32
5条答案
按热度按时间o2gm4chl1#
货币值不应使用浮点数(如Double)存储。舍入错误肯定会发生,因为这些格式在其表示中并不精确。适合MongoDB使用的类型是Decimal128类型,因为它存储了值的精确表示,并且具有足够的精度来支持所有形式的货币计算。
vpfxa7rd2#
您可以存储
Double
BSON类型来存储价格值。如果价格值为100,则可以存储为100.00
。Java的类型是
java.lang.Double
。BSON to Java data type mapping
在Java中,整数值可以转换为double。示例代码:
自3.4版本以来,有一个新的Decimal128 BSON data type可用。
Java API可以采用
BigDecimal
或long
值来构造Decimal128对象。请参考上述API文档。参考blog以理解为什么需要十进制128?
浮点运算精度问题
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
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/
67up9zun5#
对于
Number
类型,MongoDB服务器会自动将Int32
设置为数据类型