Moving from Groovy to Java
In my grails project I'm moving all calculations to java classes.
Here is the link to source code (i've saved it in Google Docs).
Main purpose is to forma开发者_JAVA百科t current time into string(in two languages). Examples:
1 day 2 hours 3 seconds
1 день 2 часа 3 секунды
But i have one method:
private static boolean endsWith(final long num, final long part) {
if (num / 10 < 1) {
return num == part;
} else {
float val1 = (num - part) / 10;
float val2 = (float) Math.floor(val1);
return val1 == val2;
}
}
It checks if 'num' ends with 'part'. Examples:
assert endsWith(128, 1) == false
assert endsWith(1, 1) == true
assert endsWith(34, 4) == true
P.S. num - is standard long (java.lang.Long) value and part - is greater than 0 and less or equals than 9 (1..9).
But this code works fine only in groovy classes.
In java class i got those results:
endsWith(7, 7) == true
endsWith(23, 3) == false
endsWith(23, 1) == true
As i can see from gant log - all code are compiled by groovyc.
P.S.2 I'l compile this code with groovyc and javac to compare results. Because if i haven't make any mistake it could be a bug in groovyc. But this is my mistake i hope :)
Why are you using floating point arithmetic at all? Why not just:
private static boolean endsWith(final long num, final long part) {
return (num % 10) == part;
}
? If it needs to work for negative numbers you'll need to take the absolute value before the mod, but otherwise that should be fine.
You should never compare floating point values with ==
due to the limited precision.
In fact in this case it doesn't look like you need to go to floating point operation at all. You can use %
to get the remainder of a number and get the last few digits this way.
Here are some examples (note the sign with negative dividend)
123 % 10 == 3
4567 % 100 == 67
-9876 % 10 == -6
References
- JLS 15.17.3 Remainder Operator %
Related questions
- What’s wrong with using == to compare floats in Java?
String
operation alternative
Another option is that if performance isn't terribly important, the easiest solution is probably to just convert to String
and use String.endsWith
. In this way you also don't have the complication with negative numbers.
System.out.println(String.valueOf(-9876).endsWith(String.valueOf(76)));
// prints "true"
I'm not sure, but I'm not comfortable with your conversions to float...
Couldn't you just use return(num % 10) == part?
精彩评论