当前位置: 首页 > 知识库问答 >
问题:

使用BigDecimal[duplicate]计算欧拉数

夏侯弘量
2023-03-14

我试图通过求和以下数列来制作一个程序来近似e:

e=1 (1 / 1!) (1 / 2!) (1 / 3!) .... (1/i!)

目前,我的代码如下所示:

public static void main(String[] args) {

        BigDecimal one = new BigDecimal(1);
        BigDecimal e = new BigDecimal(1.0);
        BigDecimal divisor = new BigDecimal(1.0);

        for (int i =  1; i <= 12; i++) {

            divisor = divisor.multiply(new BigDecimal(i));
            e = e.add(one.divide(divisor));

            System.out.println("e = " + e);

        }
    }

该程序成功地执行了n的计算(1/n!)

e=2

e=2.5

线程“main”java中出现异常。算术异常:非终止十进制扩展;没有可精确表示的十进制结果。在爪哇。数学大十进制。在ch10处分开(未知来源)。第10章近似值。main(第10章E20章,java:16)

我应该如何使用BigDecimal类为e=1(1/1!)进行求和(1 / 2!) (1 / 3!) .... (1/我!)?

共有2个答案

拓拔俊艾
2023-03-14

此错误的原因是BigDecimal试图精确计算值,但它无法做到这一点,因为1/3在基数10中永远重复。

要解决这个问题,需要定义精度和舍入模式。例如:

  e = e.add( one.divide(divisor, 20, RoundingMode.HALF_UP) );
公冶谦
2023-03-14

我们都知道,除以3会得到一个以十进制表示的数字,这个数字会一直持续下去。

0.5 / 3 = 0.166666666666666666666666666666666666666666666666666666666666666666....

这就像是在BigDecimal中对内部除法的处理,只是在计算二进制形式的ints。

您将需要一个不同的重载divide,它需要使用一个刻度(小数点之外的小数位数)和舍入模式。这告诉BigDecimal要使用多少位数,以及停止时如何取整。

e = e.add(one.divide(divisor, 20, RoundingMode.HALF_EVEN));

输出的e的最终估计值:

e = 2.71828182828616856395
 类似资料:
  • 这个问题参考了欧拉项目问题5,所以要小心剧透!问题5: 2520是可以被1到10的每个数字除的最小数,没有任何余数。可以被1到20的所有数字整除的最小正数是多少? 我用Ruby编写了以下代码作为问题5的解决方案。 然而,每当我运行脚本时,它都会挂起。请注意,我在1到10范围内的基本情况2520上测试了相同的方法,效果很好。 为什么它适用于更简单的情况,但不适用于更高级的情况?我能做些什么来修复我所

  • 本文向大家介绍欧拉图,包括了欧拉图的使用技巧和注意事项,需要的朋友参考一下 欧拉图-如果存在包含图G的每个边的闭合轨迹,则连通图G称为欧拉图。 欧拉路径-欧拉路径是仅使用图形的每个边缘一次的路径。欧拉路径在不同的顶点处开始和结束。 欧拉电路-欧拉电路是只使用图形的每个边一次的电路。欧拉电路始终在相同的顶点处开始和结束。当且仅当G的所有顶点均具有偶数度时,连通图G是欧拉图,而当且仅当其边缘集可分解为

  • 本文向大家介绍.欧拉公式相关面试题,主要包含被问及.欧拉公式时的应答技巧和注意事项,需要的朋友参考一下 参考回答:

  • 表示 Euler 的类。 欧拉角描述一个旋转变换,通过指定轴顺序和其各个轴向上的指定旋转角度来旋转一个物体。 代码示例 const a = new THREE.Euler( 0, 1, 1.57, 'XYZ' ); const b = new THREE.Vector3( 1, 0, 1 ); b.applyEuler(a); 构造器(Constructor) Euler( x : Float,