从Groovy迁移到Java

时间:2010-07-21 19:31:55

标签: java grails groovy

在我的 grails 项目中,我正在将所有计算转移到java类。

Here is the link to source code (i've saved it in Google Docs).

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

1 day 2 hours 3 seconds
1 день 2 часа 3 секунды

但我有一种方法:

 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;
    }
  }

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

assert endsWith(128, 1) == false
assert endsWith(1, 1) == true
assert endsWith(34, 4) == true

P.S。 num - 是标准长(java.lang.Long)值,部分 - 大于0且小于或等于9(1..9)。

但是这段代码只适用于 groovy 类。

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

endsWith(7, 7) == true
endsWith(23, 3) == false
endsWith(23, 1) == true

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

P.S.2 我将使用 groovyc javac 编译此代码以比较结果。因为如果我没有犯任何错误,可能是 groovyc 中的错误。但这是我的错误,我希望:)

3 个答案:

答案 0 :(得分:8)

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

private static boolean endsWith(final long num, final long part) {
  return (num % 10) == part;
}

?如果需要对负数进行处理,则需要在mod之前取绝对值,否则应该没问题。

答案 1 :(得分:6)

由于精度有限,您永远不应将浮点值与==进行比较。

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

以下是一些例子(请注意带有负红利的标志)

123 % 10 == 3
4567 % 100 == 67
-9876 % 10 == -6

参考

相关问题


String操作替代

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

System.out.println(String.valueOf(-9876).endsWith(String.valueOf(76)));
// prints "true"

答案 2 :(得分:3)

我不确定,但我对你的转换不满意......

难道你不能只使用return(num%10)== part?