Enjoy模板引擎的 expr/ast/Compare.java 中的 float 和 double == 比较问题

在 expr/ast/Compare.java 和  expr/ast/Logic.java 中都出现了 float、double 值进行 == 和 != 判断,这是 bug,需要修复。

评论区

JFinal

2019-04-09 17:21

enjoy 模板引擎是尽可能遵守 java 规则的, java 规则并不会限定你对 double、float 进行比较,自己的代码要主动避免这两个类型的比较

pizi2019

2019-04-09 17:32

@JFinal 也不能这么说啊,既然 enjoy 提供了浮点数比较,那 enjoy 应该尽可能保证正确性的。

JFinal

2019-04-09 23:15

@pizi2019 java 语言也提供了浮点数比较,例如你试试下面的代码:
public static void main(String[] args) {
float f = 0.1F;
double d = 0.1D;
System.out.println(f);
System.out.println(d);
System.out.println(f == d);
}

从上面的代码可知,java 语言并不保证相等浮点值比较时的正确性,因为计算机底层使用二进制存放数据,且 float、double 所表达的字节长度是有限的,无法精确表达浮点数

由于无法精确表示浮点数,所以对于浮点数大小的比较只能是开发者自己定一个主观标准

例如两个浮点数相减的值小于某个阈值就认为这两个浮点值相等,但这个在逻辑上仍然是主观的,小王可以取这个值为 0.001 , 小李可以取 0.000001

JFinal

2019-04-09 23:17

综上, enjoy 引擎即便要干预浮点值比较,也需要在主观上选定一个域值用于浮点数比较时的判断标准,但这个主观值不同的用户就会不一样,众口难调

最终还是将主动权留给开发者,保持与 java 一样的行为

pizi2019

2019-04-10 09:01

@JFinal 了解,目前我按照我选定的干预浮点值进行了源码修改,呵呵。

pizi2019

2019-04-10 09:02

@JFinal 对了,我看 enjoy发布了3.8,但是没有看到 enjoy 3.8 的 changelog,只看到了 jfinal 3.8 的changelog。

JFinal

2019-04-10 09:33

@pizi2019 enjoy 3.8 主要是同步 jfinal 3.8 来发布, enjoy 3.8 只进行了极少量的代码打磨,用法完全没变过

热门反馈

扫码入社