【问题标题】:mortgage calc returning negatives按揭计算返回底片
【发布时间】:2016-04-13 04:27:11
【问题描述】:

我正在尝试处理金钱(就最佳实践而言可能是错误的方式,但我认为它会起作用。它很简单,将所有内容乘以 100,然后使用整数)

    import java.util.Scanner;

公共课 PFiveFifteen {

public static void main(String[] args) 
{   
    Scanner in =new Scanner(System.in);

    int i = 0;
    double principalIn;
    int duration=0;
    double interestRate=0;
    int thisYear = 0;
    int iInterestRate = 0;
    int iPrincipalIn = 0;

    System.out.println("Please input initial amount: ");
    principalIn = in.nextDouble(); 
    iPrincipalIn= (int) principalIn *100;
    //System.out.println(principalIn*100);

    System.out.println("Please input interest rate as a decimal: ");
    interestRate = in.nextDouble()*100; 
    iInterestRate = (int) interestRate;
    //System.out.println(interestRate*100);

    System.out.println("Please input duration of investment in years: ");
    duration = in.nextInt(); 
    //System.out.println(duration);

    while(duration > i ) {

        if ( i == 0) {
            //System.out.println("Preloop value" + (iInterestRate));
            thisYear = (iPrincipalIn * iInterestRate)+ iPrincipalIn;
            //System.out.println("Postloop value" + (iPrincipalIn));
            i++;
            System.out.println("The initial value is " + thisYear);
            System.out.println("Year # one one: " +i);
            }
        else

    thisYear = (thisYear*iInterestRate) + thisYear;
    i++;
    System.out.println(thisYear/10000);
    System.out.println("year # " +i);
    }

但我在控制台中以某种方式返回负数

    Please input initial amount: 

10000

请以小数形式输入利率: 100.00

请输入投资期限(年): 10

初始值为141106540​​8

年#一一:1 141106

第 2 年 -119738

第 3 年 -72104

第 4 年 4904

第 5 年 84261

第 6 年 21917

第 7 年 154073

第 8 年 -145664

第 9 年 63722

第 10 年

这里到底发生了什么?如果那里有古怪的小数或某些东西(即使我将其全部转换为整数),我可以得到,但是狄更斯将所有正输入都降至零以下??

【问题讨论】:

  • stackoverflow.com/questions/24223440/… 不是和这个有关吗?
  • 你溢出了整数,Java 中的最大值是 2,147,483,647。一旦溢出,我认为它只会变成负数或其他东西,我知道这很奇怪......如果你需要非常大的数字,你可以使用 BigInteger 类。
  • 即使是小数值也会破坏它: 请输入初始金额:10000 请输入小数形式的利率:0.05 请输入投资期限(年):10 初始值为6000000年#一一: 1 600 年 # 2 3600 年 # 3 21600 年 # 4 129600 年 # 5 -81393 年 # 6 -58864 年 # 7 76312 年 # 8 28378 年 # 9 170272 年 # 10
  • 我尝试格式化它,但评论不会像我上面那样做。
  • 我不认为我正在做的数学运算,10000 超过 10 个循环的 5% 的复利会超过 int 允许的最大值。某处它继续将利息乘以 100,但我不知道那会在哪里。

标签: java bigdecimal currency


【解决方案1】:

您将金额表示为整数的想法是可以的,但您必须非常小心缩放比例,尤其是在乘法(或除法)时。假设您以 10 美元的本金开始,表示为 1000。然后输入 0.06 的利率(我假设用户输入的是实际利率而不是百分比,因此 0.06 表示 6%)。然后将其表示为 6。

因此,如果您的主体是 P,那么您用来表示它的 intP*100。如果你的利率是I,那么你用来表示它的int就是I*100。

所以现在你要计算 P*I。由于您将所有内容表示为实际值的 100 倍,因此您可能希望获得一个 int,其值为 P*I*100。但是当你将两个ints 相乘时,P*100 和 I*100,结果是 P* I*10000 - 100 倍太高了。那是因为您将比例因子与值相乘。我可以看到您确实输出了thisYear / 10000,但您没有更改thisYear。因此,当您继续循环时,您将获得 10000 倍的值,以及 1000000 倍的值,依此类推,最终您将溢出。 (我希望事情确实如此,但不幸的是,我无法说服我的银行使用你的算法。)

要进行调整,您需要将此结果除以 100。(我先将其加 50,这样当您除以 100 时,结果将四舍五入。)

【讨论】:

  • 我不太明白为什么这么多人喜欢使用整数而不是 BigDecimals。 BigDecimals 已经是按比例缩放的整数,因此无需非常小心。为什么要重新发明轮子? BigDecimal 不仅仅是大浮点数。
【解决方案2】:

看起来使用 ints 的想法很糟糕。

我确实让它在较小的数字上发挥作用(最大的问题是不得不再次将本金提高 100 以保持正确的占位符,以便当利息为 (p*100)*(i*100)否则它是 *100 被添加到 *10000 的利息中。可悲的是,任何实际金额(比如房子的 250000)在第一次循环之前都会溢出它。虽然 200000 一直到循环 30。

加上利率并不总是百分之一,有时它们是 .03875 之类的东西

我的代码缺乏确定长度的能力,即使它把它提升到一个 int,并且保持其他所有东西都像它一样(将所有东西乘以 100000)肯定是行不通的。

感谢社区不要称我为白痴!在 Youtube 等人上,我会得到让我哭到角落的答案!

【讨论】:

  • 250000 对于一所房子来说不是一个现实的数字——不是我住的地方。 250000可以给我一个车库。 :) 我认为我所在地区至少有一所房子,如果你将其放大 100 倍,即使是 int 也不足以保持售价。一些 NBA 球星买了它。无论如何,你可以使用long
  • @ajb:取决于货币和您居住的地方。 25万欧元的房子在这里很正常。
  • @RudyVelthuis 糟糕,我对货币类型做出假设很糟糕。而且我应该知道得更多,因为就在这周我一直在编写代码来处理不同的货币类型。 :( 我想我们应该排除 250k 日元,因为我必须住在冰箱里。无论如何,250000 美元足以在美国大部分地区买一套像样的房子。只是不在我附近。
  • 你们太搞笑了!并且正确。当我将它缩放 100 时,它确实抛出了错误。一些非常聪明的 Stackoverflow 人应该聚在一起编写/编译最常见问题和解决方案的书籍......你在我的第一门编程课程中很有帮助,这本书只是没有解释的东西和你们大多数人一样。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-07-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多