NutzCN Logo
问答 EL.eval(String)数值运算问题
发布于 1713天前 作者 laizhiming 1911 次浏览 复制 上一个帖子 下一个帖子
标签:

EL.eval()用挺久了,平时都挺正常的,突然才发现出问题。
遇到某些数值(无特殊规律)处理的结果达不到预想值,主要是double精度问题,用float满足不了业务需求(数值超出范围)。
求助作者帮忙解决一下~感谢~

测试代码如下(注释是输出结果):

    public static void main(String[] args) {
        System.out.println(El.eval("175843.92D==115203.95D+60639.97D"));        // false
        System.out.println(El.eval("175843.92D"));        // 175843.92
        System.out.println(El.eval("115203.95D"));        // 115203.95
        System.out.println(El.eval("60639.97D"));        // 60639.97
        System.out.println(El.eval("115203.95D+60639.97D"));        // 175843.91999999998

        System.out.println(El.eval("175843.92F==115203.95F+60639.97F"));        //  true
        System.out.println(El.eval("175843.92F"));        // 175843.92
        System.out.println(El.eval("115203.95F"));        // 115203.95
        System.out.println(El.eval("60639.97F"));        // 60639.97
        System.out.println(El.eval("115203.95F+60639.97F"));        //  175843.92
    }
4 回复

浮点数运算别用=来验算,二进制下不会完全等价的

用BigDecimal去运算是没有问题的,不知道底层具体运算的时候可否改造一下,现在在跟源代码试试看。

你可以试试

我试过, 并不好改, 浮点数从字符串转为dobule的时候,精度就已经有问题

要么, 内部全部用BigDecimal/BigInteger表示数值, 但BigDecimal与BigInteger的运算也会蛋疼, 而且对外返回的时候,是返回BigDecimal/BigInteger还是dobule/long呢?

要么,内部还是double/long,然后运算时转为BigDecimal/BigInteger, 这样精度依然丢, 解决不了问题

我已经改了一套BigDecimal的计算方式,不过很多细节不太好处理,比如保留多少位小数点的问题。

添加回复
请先登陆
回到顶部