Java 如何更改Math.PI的值

Java 如何更改Math.PI的值,java,math,Java,Math,我是一个科学应用的首席开发者。我们有一个新的会计要求,pi=3.14。但是在JavaMath.PI=3.14159中。。。我试着用反思来改变它。但这似乎不起作用,我们称之为的一些库仍然使用pi的旧值。例如,当我们积分1/(x*x+1)时,结果仍然是3.14159。。。不是3.14。我什么都试过了…拜托,我怎样才能改变数学。圆周率 编辑:这是我们全公司会计准则的一个练习 出于合规性原因,所有数值常数必须精确到小数点后两位,所有计算必须相应地进行,并与该精度水平保持一致 我特别问到pi,他们说是的,

我是一个科学应用的首席开发者。我们有一个新的会计要求,pi=3.14。但是在JavaMath.PI=3.14159中。。。我试着用反思来改变它。但这似乎不起作用,我们称之为的一些库仍然使用pi的旧值。例如,当我们积分1/(x*x+1)时,结果仍然是3.14159。。。不是3.14。我什么都试过了…拜托,我怎样才能改变数学。圆周率

编辑:这是我们全公司会计准则的一个练习

出于合规性原因,所有数值常数必须精确到小数点后两位,所有计算必须相应地进行,并与该精度水平保持一致


我特别问到pi,他们说是的,pi必须精确到小数点后两位数…

简短的回答是:不能使用反射或任何其他方式更改数学

Math.PI
常量是一个编译时常量,正如JLS所解释的():

如果在字段声明中将
final
字段初始化为常量表达式(),则可能无法观察到对final字段的更改,因为该final字段的使用在编译时会替换为常量表达式的值

如果需要一个PI常量,其值与标准值不同,则需要在自己的类或接口中定义自己的常量


不幸的是,定义自己的PI对于发布此法令的人来说可能还不够。。。因为将实现标准和第三方数学库,以便为pi、e等使用数学上正确的值。找到/修复所有这些基本上都需要实现自己的JVM

但这里有一个“建设性”的解决方案。在计算器中根本不支持
PI
常量。相反,支持
pi()
函数。。。它返回一个全精度值。如果是“they”对象,则使
pi()
返回的值依赖于命令行选项或其他内容

或者,做明智的事,无视这条疯狂的法令。例如,您说该法令来自公司范围的会计软件标准。你在写一个科学应用程序,所以你可以说“会计规则”不适用1



1-当然,任何具有重要科学或数学知识的人都会告诉你,他们不应该应用。

如果
Math.PI
定义为
Double
,你可以使用reflect来更改它。

会计学是否也希望将自然对数e的值更改为2?对不起,这不是一个专业的说法,但你的问题回避了一个问题:会计为什么要这么做?否则,创建您自己的常量,比如说
Accounting.PI
,给它您自己的值,然后在程序中重新分配所有常量。为什么不让他们删除这个愚蠢的要求呢?即使您可以重新定义
Math.PI
,积分
2/(x*x+1)
仍然可以得到3.14159。。。这与Java无关……这是一个“科学”应用程序,pi为3.14。(什么…?)这一定是一个笑话或是对要求的一个可怕的误解。“或者,做明智的事情,忽略这条疯狂的法令。”这就是我在面对类似要求时所做的(在工程应用中改变重力常数的值)。实施起来会很疯狂,而且不可能进行测试。这与Stephen的答案有什么不同?而且,这不会改变从不依赖于常数的库或内部函数获得的结果。