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
}
答案 0 :(得分:3)
我注意到的是,如果传递的值是1.00001,那么我得到的值与调用函数中的值相同,但是如果传递的值是0.00001,则我得到的值是1.0E-5
从措辞来看,似乎在调试时(通过打印或在调试器中)看到user
和(anr=searchstring*)
。重要的是要了解
这与任何内部差异都不对应,只是Double.toString
is defined in Java的方式。
当您执行类似1.00001
的操作时,该值不完全是1.00001,而是可表示为1.0E-5
的最接近的数字:1.000010000000000065512040237081237137317657470703125。查看准确值的最简单方法是查看BigDecimal.exact(valueToCheck)
。
保留数字的唯一方法是不首先使用val x = 1.00001
。如果将其作为字符串传递,则从字符串创建Double
。如果是某些计算结果的两倍,请考虑在Double
上进行计算。但是BigDecimal
的字符串表示形式根本不包含您想要的信息。