Scala中Double数据类型出现问题

时间:2019-06-18 08:59:10

标签: scala double precision

Scala的新手,正在尝试在Scala中提供一个库,以检查所传递的double值是否具有一定的精度和小数位数。我注意到的是,如果传递的值是1.00001,那么我在调用的函数中得到的值,但是如果传递的值是0.00001,则我得到的值是1.0E-5,有什么办法可以保留Scala中的数字?

def checkPrecisionAndScaleFormat(precision: Int, scale: Int)(valueToCheck: Double): Boolean = {
  val value = BigDecimal(valueToCheck)
  value.precision <= precision && value.scale <= scale
}

1 个答案:

答案 0 :(得分:3)

  

我注意到的是,如果传递的值是1.00001,那么我得到的值与调用函数中的值相同,但是如果传递的值是0.00001,则我得到的值是1.0E-5

从措辞来看,似乎在调试时(通过打印或在调试器中)看到user(anr=searchstring*) 。重要的是要了解

  1. 这与任何内部差异都不对应,只是Double.toString is defined in Java的方式。

  2. 当您执行类似1.00001的操作时,该值不完全是1.00001,而是可表示为1.0E-5的最接近的数字:1.000010000000000065512040237081237137317657470703125。查看准确值的最简单方法是查看BigDecimal.exact(valueToCheck)

保留数字的唯一方法是不首先使用val x = 1.00001。如果将其作为字符串传递,则从字符串创建Double 。如果是某些计算结果的两倍,请考虑在Double上进行计算。但是BigDecimal的字符串表示形式根本不包含您想要的信息。