Reputation: 2106
New to Scala and am trying to come up with a library in Scala to check if the double value being passed is of a certain precision and scale. What I noticed was that if the value being passed is 1.00001 then I get the value as that in my called function, but if the value being passed is 0.00001 then I get the value as 1.0E-5, Is there any way to preserve the number in Scala?
def checkPrecisionAndScaleFormat(precision: Int, scale: Int)(valueToCheck: Double): Boolean = {
val value = BigDecimal(valueToCheck)
value.precision <= precision && value.scale <= scale
}
Upvotes: 1
Views: 1881
Reputation: 170723
What I noticed was that if the value being passed is 1.00001 then I get the value as that in my called function, but if the value being passed is 0.00001 then I get the value as 1.0E-5
From your phrasing, it seems like you see 1.00001
and 1.0E-5
when debugging (either by printing or in the debugger). It's important to understand that
this doesn't correspond to any internal difference, it's just how Double.toString
is defined in Java.
when you do something like val x = 1.00001
, the value isn't exactly 1.00001 but the closest number representable as a Double
: 1.000010000000000065512040237081237137317657470703125. The easiest way to see the exact value is actually looking at BigDecimal.exact(valueToCheck)
.
The only way to preserve the number is not to work with Double
to begin with. If it's passed as a string, create the BigDecimal
from the string. If it's the result of some calculations as a double, consider doing them on BigDecimal
s instead. But string representation of a Double
simply doesn't carry the information you want.
Upvotes: 3