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

使用2D和1D数组计算利率

万俟渝
2023-03-14

我是Java新手,我应该计算10年后1000欧元的利率发展,并增加百分比(3%, 4%, 5%, 6%, 7%)。我在弄清楚如何在两个数组之间进行计算时遇到了很多麻烦。真正的困难是将1000欧元放在二维数组的第一[0]行(0年),并每年将利率添加到数组的下一行。这是我到现在还能做的,但现在我完全卡住了:

public class zinsenEntwicklung {
    /**
     * @param args
     */
    public static void main(String[] args) {
        final int N1 = 11;
        final int N2 = 5;
        double anfang = 1000;
        double zinsenTable[] = {0.03, 0.04, 0.05, 0.06, 0.07};
        double b[][] = new double[N1][N2];
        System.out.println("Jahr");
        for (int i = 0; i < 11; i++) {
            System.out.print(i + "\t");
            for (int j = 0; j < zinsenTable.length; j++) {
                for (int k = 0; k < i; k++) {
                    b[i][j] = (anfang * zinsenTable[j]) + anfang;
                }
                System.out.print(b[i][j] + "\t");
            }
            System.out.print("\n");
        }
    }
}

我应该得到什么:


Jahr   3%        4%        5%         6%       7%
0   1.000,00  1.000,00  1.000,00  1.000,00  1.000,00 
1   1.030,00  1.040,00  1.050,00  1.060,00  1.070,00
2   1.060,90  1.081,60  1.102,50  1.123,60  1.144,90
...
10  1.343,92  1.480,24  1.628,89  1.790,85  1.967,15

我得到的是:

Jahr
0   0.0 0.0 0.0 0.0 0.0 
1   1030.0  1040.0  1050.0  1060.0  1070.0  
2   1030.0  1040.0  1050.0  1060.0  1070.0  
3   1030.0  1040.0  1050.0  1060.0  1070.0  
4   1030.0  1040.0  1050.0  1060.0  1070.0  
5   1030.0  1040.0  1050.0  1060.0  1070.0  
6   1030.0  1040.0  1050.0  1060.0  1070.0  
7   1030.0  1040.0  1050.0  1060.0  1070.0  
8   1030.0  1040.0  1050.0  1060.0  1070.0  
9   1030.0  1040.0  1050.0  1060.0  1070.0  
10  1030.0  1040.0  1050.0  1060.0  1070.0  

我真的很感激每一个关于我做错了什么的建议。

共有2个答案

谢璞
2023-03-14

在您的代码中,您总是乘以相同的值:

b[i][j] = (anfang * zinsenTable[j]) + anfang;

这就是为什么你在每一行都得到相同的值,你需要做的是将矩阵的第一行设置为1000(无论anfan是什么意思),然后根据前一行计算即将到来的值。

这样地:

for (int i = 0; i < N1; i++) {
    System.out.print(i + "\t");
    for (int j = 0; j < N2; j++) {
        if (i == 0) {
            b[i][j] = anfang;
        } else {
            b[i][j] = (b[i - 1][j] * zinsenTable[j]) + b[i - 1][j];
        }
        System.out.print(b[i][j] + "\t");
    }
    System.out.print("\n");
}

注意第一次运行时所有行是如何初始化为anfang的

if (i == 0) {
    b[i][j] = anfang;
}

然后根据前一行*百分比计算以下所有行

b[i][j] = (b[i - 1][j] * zinsenTable[j]) + b[i - 1][j];

只要运行这段代码,您就会看到显示了很多小数位,如果您想将其限制为2(如示例中所示),您可以使用System.out.printf

System.out.printf("%.2f" + "\t", b[i][j]);

一个额外的提示:

您使用Double计算货币,这是一种已知的错误做法,因为浮点精度。公认的方法是使用BigDecimal

洪德寿
2023-03-14

你需要在最后一年的价值上加上利息。我还在第一年添加了安方价值。

public class ZinsenEntwicklung {
    /**
     * @param args
     */
    public static void main(String[] args) {
        final int N1 = 11;
        final int N2 = 5;
        double anfang = 1000;
        double zinsenTable[] = {0.03, 0.04, 0.05, 0.06, 0.07};
        double b[][] = new double[N1][N2];
        for (int i = 0; i < b[0].length; i++) {
            b[0][i] = anfang;
        }
        System.out.println("Jahr");
        for (int i = 1; i < 11; i++) {
            System.out.print(i + "\t");
            for (int j = 0; j < zinsenTable.length; j++) {
                for (int k = 0; k < i; k++) {
                    b[i][j] = (b[i - 1][j] * zinsenTable[j]) + b[i - 1][j];
                }
                System.out.print(b[i][j] + "\t");
            }
            System.out.print("\n");
        }
    }
}

运行此命令可以获得以下输出:

Jahr
1       1030.0  1040.0  1050.0  1060.0  1070.0
2       1060.9  1081.6  1102.5  1123.6  1144.9
3       1092.727        1124.8639999999998      1157.625        1191.0159999999998      1225.0430000000001
4       1125.50881      1169.85856      1215.50625      1262.4769599999997      1310.79601
5       1159.2740743    1216.6529024    1276.2815624999998      1338.2255775999997      1402.5517307
6       1194.052296529  1265.319018496  1340.0956406249998      1418.5191122559997      1500.730351849
7       1229.87386542487        1315.93177923584        1407.1004226562497      1503.6302589913598      1605.78147647843
8       1266.770081387616       1368.5690504052736      1477.4554437890622      1593.8480745308414      1718.18617983192
9       1304.7731838292445      1423.3118124214845      1551.3282159785153      1689.478959002692       1838.4592124201545
10      1343.9163793441219      1480.244284918344       1628.894626777441       1790.8476965428533      1967.1513572895653

我希望你用一个格式化的字符串作为输出,看起来很好,并且不会有很多小数位。

顺便说一句,java中的类名在开头用大写字母书写。

 类似资料:
  • 问题内容: 对于数组中也是数组中的每个元素,我想将值设置为0,这将创建数组 我知道有一种使用和将其作为1D数组进行广播的方法,但是我不知道该如何进行。 任何帮助将不胜感激。 问题答案: 如果将切片的2D数组馈入到其中,它将把它展平为1D数组并与之进行比较,从而创建一个1D蒙版,可以对其进行整形并用于对该切片数组进行布尔索引以将元素设置为。单线实施看起来像这样- 样品运行- 为了简化操作,您可以创建

  • 问题内容: 我尝试运行如下代码: 我认为的形状应为(1,3)而不是(3,)。 矩阵返回的结果应为: 数组([[23],[53],[83]]) 不 数组([23,53,83]) 为什么会发生结果? 问题答案: 顾名思义,该函数的主要目的是通过在两个形状相同的数组上执行 传统的线性代数点积 来提供标量结果。 鉴于这一主要目的,在文档中也对这种情况下的第一(第一子弹下方点)谈到: 您的案件已在他的评论的

  • 问题内容: 我正在尝试连接4个数组,一个1D形状的数组(78427,)和3个2D形状的数组(78427,375/81/103)。基本上,这是4个数组,具有78427个图像的特征,其中1D数组每个图像仅具有1个值。 我尝试串联数组,如下所示: 这将导致以下错误: 追溯(最近一次调用):文件“”,第1行,在ValueError中:所有输入数组的维数必须相同 问题似乎是一维数组,但是我真的看不出来为什么

  • 我正在处理C#并发队列和多线程在套接字编程TCP/IP 首先,我已经完成了套接字编程本身。这意味着,我已经完成了关于客户机、服务器和通信本身的编码 到目前为止,我已经实现了putting_data到queue1(Thread1)和全部出列(Thread2),其速度大约是700Mbps 我使用两个concurrent_queue的原因是,我希望通信和类型转换工作在后台处理,而不考虑有关控制的主要过程

  • 问题内容: 我有2个1d数组,而我正在尝试将它们填充到JAVA中的单个2d数组中。 例如: 结果应为: 我该怎么办?我目前有这样的事情: 我有点被困在那里… 问题答案: 2D数组是数组的数组。那你为什么不试试这个呢? 为了确保它是如此简单并且可以正常工作,请进行以下测试:

  • 在这里,我试图将转换为一个1D数组。