代码之家  ›  专栏  ›  技术社区  ›  yalkris

scala和total中的四舍五入百分比应与100匹配

  •  1
  • yalkris  · 技术社区  · 6 年前

    seqOfTuples: List[(String, Double)] = List((a,25.52), (a,25.54), (a,48.94), (b,25.52), (b,25.54), (b,48.94))
    

    我试图将这些元组中的第二个值四舍五入到一个十进制数,并将它们等于任何给定第一个值的和100(通过将余额分数加到最后一个数字)。

    result: List[(String, AnyVal)] = List((a,25.5), (a,25.5), (a,49), (b,25.5), (b,25.5), (b,49))
    

    scala> val partialResult = seqOfTuples.map (x => (x._1, BigDecimal(x._2).setScale(1, BigDecimal.RoundingMode.HALF_UP).toDouble))
    partialResult: List[(String, Double)] = List((a,25.5), (a,25.5), (a,48.9), (b,25.5), (b,25.5), (b,48.9))
    

    我怎么能做到呢?

    0 回复  |  直到 6 年前
        1
  •  1
  •   jwvh    6 年前

    partialResult (简称 pr Double 值来自 100.0 直到你不舒服地接近零,在这一点上你忽略了收到的 双倍 重新计算它的“真”值。

    pr.foldLeft((Map.empty[String,Double].withDefaultValue(100.0)
                ,List.empty[(String,Double)])){ case ((m,res),(str,dbl)) =>
        if (math.abs(m(str) - dbl) < 1.1)  //too close
          (m, (str,m(str))::res)           //use remainder
        else
          (m + (str -> (m(str)-dbl)), (str,dbl)::res)  //update Map, build result
    }._2.reverse
    //res0: List[(String, Double)] = List((a,25.5), (a,25.5), (a,49.0)
    //                                  , (b,25.5), (b,25.5), (b,49.0))
    
    推荐文章