四舍五入在scala中的百分比,总计应匹配100

时间:2019-02-12 20:32:33

标签: scala rounding

我有一个元组的scala序列,如下所示

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))

到目前为止,我一直在尝试四舍五入,但是结果并不等于100。

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))

我该怎么做?

1 个答案:

答案 0 :(得分:1)

从您的partialResult(以下简称为pr)开始,您可以从Double中减去100.0的值,直到您不舒服地接近零为止,此时您忽略收到的Double并重新计算其“真实”值。

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))