从Groovy迁移到Java

Ole*_*ndr 4 java grails groovy

在我的grails项目中,我将所有计算都移到java类中.

这是源代码的链接(我已将其保存在Google文档中).

主要目的是将当前时间格式化为字符串(两种语言).例子:

1 day 2 hours 3 seconds
1 ???? 2 ???? 3 ???????
Run Code Online (Sandbox Code Playgroud)

但我有一个方法:

 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;
    }
  }
Run Code Online (Sandbox Code Playgroud)

它检查'num'是否以'part'结尾.例子:

assert endsWith(128, 1) == false
assert endsWith(1, 1) == true
assert endsWith(34, 4) == true
Run Code Online (Sandbox Code Playgroud)

PS num - 标准长(java.lang.Long)值,part - 大于0且小于或等于9(1..9).

但是这个代码只在groovy类中工作正常.

java类中,我得到了这些结果:

endsWith(7, 7) == true
endsWith(23, 3) == false
endsWith(23, 1) == true
Run Code Online (Sandbox Code Playgroud)

正如我从gant日志中看到的- 所有代码都是由groovyc编译的.

PS2 I'l编译这段代码groovyc的javac的比较结果.因为如果我没有犯任何错误,那可能是groovyc中的一个错误.但这是我的错误,我希望:)

Jon*_*eet 8

为什么要使用浮点运算?为什么不呢:

private static boolean endsWith(final long num, final long part) {
  return (num % 10) == part;
}
Run Code Online (Sandbox Code Playgroud)

?如果它需要为负数工作,你需要在mod之前取绝对值,否则应该没问题.


pol*_*nts 6

==由于精度有限,您永远不应该比较浮点值.

实际上在这种情况下,看起来你根本不需要进行浮点运算.您可以使用%获取数字的其余部分并以这种方式获得最后几位数字.

以下是一些例子(注意带有负股息的标志)

123 % 10 == 3
4567 % 100 == 67
-9876 % 10 == -6
Run Code Online (Sandbox Code Playgroud)

参考

相关问题


String 操作选择

另一种选择是,如果性能不是非常重要,最简单的解决方案可能就是转换String并使用String.endsWith.这样你也没有负数的复杂性.

System.out.println(String.valueOf(-9876).endsWith(String.valueOf(76)));
// prints "true"
Run Code Online (Sandbox Code Playgroud)