Java:如何替换常见的三角函数值

Java: How to replace common trigonometric values

我想知道如何在 expression 中替换 common trigonometric values。为了更具体地说明这一点,我正在制作一个计算器,它需要能够评估用户输入,例如“sin(Math.PI)”或“sin(6 * math.PI/2)”。问题是 floating point values 不准确,当我输入 sin(Math.PI) 时,计算器的结果是:

1.2245457991473532E-16

但我想要它 return 0。我知道我可以尝试用 0、1 等替换表达式中的所有 sin(Math.PI) 和其他常用表达式,但我必须检查 Math.PI/2 的所有倍数。你们中的任何人都可以给我一些关于如何 return 用户正确值的指导吗?

您 运行 遇到的问题是不太可能用固定的位数来表示像 pi 这样的数字,因此在可用的机器精度下,计算会为您提供一个很小但非零的数字数字。 Math.PI在任何情况下都只是PI的一个近似值,是一个无理数。为了显示目的清理您的答案,一种可能是使用舍入。您可以改为尝试向其中添加 +1 和 -1,这可能会将答案四舍五入为零。

这里的这个问题可能会进一步帮助您: Java Strange Behavior with Sin and ToRadians

您的问题是 1.2245457991473532E-16 实际上在很多方面都是零。简单地将 sin 产生的结果四舍五入怎么样?通过足够的四舍五入,你可以达到你想要的效果,甚至可以相对轻松地得到 0.5、-0.5 和其他重要的 sin 值。

如果你真的想替换那些如你的标题所暗示的功能,那么你不能在Java中做到这一点。您最好的选择是为常见功能创建一个 SPI 规范,该规范可以回退到标准 Java 实现或使用您自己的实现,它取代 Java 一个。

那么您的解决方案的用户将需要使用对工厂方法的显式引用的依赖注入来检索其中一个实现。