由 x 到 y 由 z 生成的 scala 中的数组导致长小数
Array in scala produced by x to y by z resulting in long decimals
我正在尝试通过 val arrayOfDoubles = (0.0 to 1.0 by 0.1).toArray
生成双精度数字范围,但结果与我预期的不同。结果类似于 Array(0.0, 0.1, 0.2, 0.30000000000000004, 0.4, 0.5, 0.6, 0.7, 0.7999999999999999, 0.8999999999999999, 0.9999999999999999)
。为什么会这样。我可以使用此代码来获得我期望的结果:
val roundedArray = for (x <- arrayOfDoubles) yield BigDecimal(x).setScale(1, BigDecimal.RoundingMode.HALF_UP).toDouble
结果是 Array[Double] = Array(0.0, 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 1.0)
但是对于 BigDecimal 将 double 转换为 String 然后解析它来说,这看起来真的很麻烦和昂贵。
有没有办法让 NumericRange 已经四舍五入到小数点后一位?
谢谢。
0 to 10 map (_ / 10.0)
应该可以解决问题
浮点运算不精确,即一些小数不能精确表示,而是用最接近的可用数字表示。另见 Is floating point math broken?
我正在尝试通过 val arrayOfDoubles = (0.0 to 1.0 by 0.1).toArray
生成双精度数字范围,但结果与我预期的不同。结果类似于 Array(0.0, 0.1, 0.2, 0.30000000000000004, 0.4, 0.5, 0.6, 0.7, 0.7999999999999999, 0.8999999999999999, 0.9999999999999999)
。为什么会这样。我可以使用此代码来获得我期望的结果:
val roundedArray = for (x <- arrayOfDoubles) yield BigDecimal(x).setScale(1, BigDecimal.RoundingMode.HALF_UP).toDouble
结果是 Array[Double] = Array(0.0, 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 1.0)
但是对于 BigDecimal 将 double 转换为 String 然后解析它来说,这看起来真的很麻烦和昂贵。
有没有办法让 NumericRange 已经四舍五入到小数点后一位?
谢谢。
0 to 10 map (_ / 10.0)
应该可以解决问题
浮点运算不精确,即一些小数不能精确表示,而是用最接近的可用数字表示。另见 Is floating point math broken?