mXparser 结果四舍五入
mXparser result rounding
我正在 android 应用程序中试用 mXparser,我几乎可以正常使用了。但是,如果我解析以下表达式“10/3”,那么它 returns: 3.33333333335。到底为什么要四舍五入?以及如何告诉 mXparser 改为 return 3.33333333333?
我正在使用 kotlin 编写应用程序并通过 Maven 添加了 mXparser。
或者,您知道 better/more used/more 为 Android 维护的数学解析器库吗?
原因是计算机以 2 为底数而不是 10 为底数进行计算。数字 10/3 在以 2 为底数和以 10 为底数的情况下都有无限扩展,这意味着它必须被截断。 10/3 的小数展开式是 3.333...,当您将其截断时,它会简化为一串 3;虽然二进制展开式是 11.010101010101... 当您将其截断并转换回十进制时,完全可以相信您可以在最后得到 5。
我不确定您在使用计算机时是否可以解决这个问题,因为计算机必须使用二进制文件,而且它们还必须截断二进制扩展。
任何基于 IEEE 754 double precision will give the same answer. That includes all major programming languages. This is a very frequent SO question. See for example Is floating point math broken?
的系统
解决方案是永远不要对输出使用默认的 Double.toString() 方法。使用并输出特定的小数位数,问题就消失了。
一个更复杂的解决方案是使用数字的比率表示,因此 10/3 的结果在内部存储为有理数 {numerator:10,denominator:3}
。这适用于基本算术,但不适用于 cos(x) 或 sqrt(x) 等函数。 Jep 解析评估库确实有允许定量的选项。 (免责声明我是 Jep 的作者之一)。
我正在 android 应用程序中试用 mXparser,我几乎可以正常使用了。但是,如果我解析以下表达式“10/3”,那么它 returns: 3.33333333335。到底为什么要四舍五入?以及如何告诉 mXparser 改为 return 3.33333333333?
我正在使用 kotlin 编写应用程序并通过 Maven 添加了 mXparser。
或者,您知道 better/more used/more 为 Android 维护的数学解析器库吗?
原因是计算机以 2 为底数而不是 10 为底数进行计算。数字 10/3 在以 2 为底数和以 10 为底数的情况下都有无限扩展,这意味着它必须被截断。 10/3 的小数展开式是 3.333...,当您将其截断时,它会简化为一串 3;虽然二进制展开式是 11.010101010101... 当您将其截断并转换回十进制时,完全可以相信您可以在最后得到 5。 我不确定您在使用计算机时是否可以解决这个问题,因为计算机必须使用二进制文件,而且它们还必须截断二进制扩展。
任何基于 IEEE 754 double precision will give the same answer. That includes all major programming languages. This is a very frequent SO question. See for example Is floating point math broken?
的系统解决方案是永远不要对输出使用默认的 Double.toString() 方法。使用并输出特定的小数位数,问题就消失了。
一个更复杂的解决方案是使用数字的比率表示,因此 10/3 的结果在内部存储为有理数 {numerator:10,denominator:3}
。这适用于基本算术,但不适用于 cos(x) 或 sqrt(x) 等函数。 Jep 解析评估库确实有允许定量的选项。 (免责声明我是 Jep 的作者之一)。