我是科学应用程序的首席开发人员。从会计上我们有一个新的要求,即pi = 3.14。但是在JAVA Math.PI = 3.14159 ...中,我尝试通过反射对其进行更改。但是似乎不起作用,我们称为 still 的某些库使用pi的旧值。例如,当我们对1 /(x * x + 1)进行积分时,结果仍然是3.14159 ...而不是3.14。我已经尝试了所有方法...请问如何更改Math.PI ???
编辑:这是我们公司会计准则的摘录。
出于合规性原因,所有数字常数必须精确到小数点后两位数,并且所有计算都必须相应地进行并且与此精度水平相符。
我特别询问了pi,他们说是的,pi必须精确到两位十进制数字...
答案 0 :(得分:20)
最简单的答案是:您不能使用反射或任何其他方式更改Math.PI
。
Math.PI
常量是编译时常量,正如JLS解释的(JLS 17.5.3):
“如果在字段声明中将
final
字段初始化为常量表达式(§15.28),则可能不会观察到对final字段的更改,因为在编译时会替换该final字段的用法时间与常量表达式的值。”
如果您需要一个与标准值不同的PI常量,则需要在自己的类或接口中定义自己的常量。
不幸的是,对于发布此法令的人们来说,定义自己的PI可能还不够……因为将实现标准和第三方数学库,以使用pi,e等在数学上正确的值。找到/修复所有这些问题基本上需要实现自己的JVM。
但这是一个“建设性”的解决方案。完全不支持计算器中的PI
常量。而是支持pi()
函数...,该函数返回完整的精度值。如果是“他们”对象,则使pi()
返回的值取决于命令行选项或其他内容。
或者,只做明智的事情,而忽略这个疯狂的法令。例如,您说该命令来自公司范围内的会计软件标准。您正在编写一个科学应用程序,因此您可能会争辩说“会计规则”不适用 1 。
1-当然,任何具有重大科学或数学知识的人都会告诉你,他们不应该申请。
答案 1 :(得分:-6)
如果将Math.PI
定义为Double
,则可以使用反射来更改它。