【问题标题】:Rounding to 2 decimal places in mongodb在 mongodb 中舍入到小数点后 2 位
【发布时间】:2017-02-01 05:43:42
【问题描述】:

我的收藏是

学生

{
    "first_name":"Harew",
    "last_name":"Jackson",
    "class":14,
    "fee": [
        { "tuition":48500.2456, "transportation":500 }
    ]
}

我需要根据fee = 4500.24 过滤学生,它应该显示 所有学费为 4500.24 的学生忽略小数点后的其他数字。

我搜索过MongoDB: How to get N decimals precision in a query 查询中的精度,但此处提供的解决方案在我的场景中不起作用,因为 "$mod": [ "$amount.value", 0.01 ] 不适用于BigDecimal 类型,在我的收藏中,我的费用类型为BigDecimal

以下解决方案似乎效果很好,但我不知道如何在 Scala 中实现它

db.collection.find({ 
    "$where": function() { 
        return Math.round(this.fee.school * 100)/ 100 === 1.12; 
    }
}) 

【问题讨论】:

  • 48500.2456 不等于 48500.24,不应在查询中使用。但是,出于报告目的,您可以根据自己的选择对其进行四舍五入。仅供参考 48500.2456 轮到 48500.25 而不是 48500.24

标签: mongodb scala playframework mongodb-query


【解决方案1】:

您可以轻松地将 BigDecimal 中的值四舍五入为特定精度,如果您愿意,也可以同时将其转换为双精度值。 例如:-

scala> val s :BigDecimal = 10.232 s: BigDecimal = 10.232

scala> s.setScale(2, BigDecimal.RoundingMode.HALF_UP).toDouble res1: Double = 10.23 // 转换为 DOUBLE

scala> s.setScale(2, BigDecimal.RoundingMode.HALF_UP) res2: scala.math.BigDecimal = 10.23 // 路由关闭

所以在 scala 中,您可以使用 setScale,而不是使用 math.Round。

【讨论】:

  • 我已经试过了。但它没有用。它对值进行了四舍五入,但与数据库中的值不匹配。例如我的数据库有学费值 48500.2456 但这样做后我得到 48500.24 但与数据库的数据不匹配
  • 对不起,我没有明白你的意思,你告诉你正在转换来自数据库的值,即 48500.2456 到 48500.24,但是你说它与数据库的数据不匹配。我们现在谈论的是哪些数据。您是否正确转换了 db 中的数据以及 BigDecimals 中的匹配值。
  • 我现在数据库中有 48500.2456 我想要的是通过在 scala 中查询来匹配费用为 48500.24 的学生
  • 好的。所以使用下面的代码: - 48500.2456.setScale(2, BigDecimal.RoundingMode.FLOOR) == 48500.24。其中 48500.2456 是您从 DB 获得的值。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-07-03
相关资源
最近更新 更多