Scala中双数据类型的问题

Scala中双数据类型的问题,scala,double,precision,Scala,Double,Precision,我是Scala新手,正在尝试在Scala中创建一个库来检查传递的双精度值是否具有一定的精度和比例。我注意到,如果传递的值是1.00001,那么我得到的值与被调用函数中的值相同,但是如果传递的值是0.00001,那么我得到的值是1.0E-5,有没有办法在Scala中保留该数字 def checkPrecisionAndScaleFormat(precision: Int, scale: Int)(valueToCheck: Double): Boolean = { val value = Bi

我是Scala新手,正在尝试在Scala中创建一个库来检查传递的双精度值是否具有一定的精度和比例。我注意到,如果传递的值是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
}
def checkPrecisionAndScaleFormat(精度:Int,标度:Int)(valueToCheck:Double):布尔={
val值=大十进制(valueToCheck)
数值精度
我注意到,如果传递的值是1.00001,那么我得到的值与调用函数中的值相同,但是如果传递的值是0.00001,那么我得到的值是1.0E-5

从您的措辞来看,在调试时(通过打印或在调试器中),您似乎看到了
1.00001
1.0E-5
。了解这一点很重要

  • 这与任何内部差异都不对应,只是方式不同而已

  • 当您执行类似于
    val x=1.00001
    的操作时,该值不是精确的1.00001,而是表示为
    双精度的最接近的数字:1.000010000000065512040237081237137317657470703125。查看精确值的最简单方法是实际查看


  • 保存数字的唯一方法是不使用<代码>双。如果将它作为字符串传递,则从字符串中创建<代码> BigDecimal <代码>。如果是两个计算的结果,请考虑在<代码> BigDecimal > /代码> s上进行。但是“代码>双< /代码>的字符串表示根本不存在。携带您想要的信息。

    1.0E-5
    非常精确。确实如此,但我需要检查精度和比例,以便获取值