Java双变量在减法后拒绝变为负数 double interest_pos=1.0003,interest_neg=-0.002; double balance=CustomerList.getItem(i).get_balance(); 布尔事务=假; 对于(整数mth=1;mth=0)余额*=利息; 其他余额*=利息负; } 其他的 { 如果(余额>=0)余额*=利息; 其他余额*=利息负; } } } System.out.println(“日”+mth+“余额”+余额); 交易=虚假;
以上是我代码的一部分。我的代码的其余部分从文本文件中读取数据,在double值应该减去500.0的部分之前,一切都正常 第22天余额225.86301881168654 第23天余额0.5478672869645392 第22天之后,应该是-275.54。。。。。。但它却展示了它现在所展示的东西。这是我任务的最后一部分,我被困在这里好几个小时寻找解决方案!提前感谢您的帮助Java双变量在减法后拒绝变为负数 double interest_pos=1.0003,interest_neg=-0.002; double balance=CustomerList.getItem(i).get_balance(); 布尔事务=假; 对于(整数mth=1;mth=0)余额*=利息; 其他余额*=利息负; } 其他的 { 如果(余额>=0)余额*=利息; 其他余额*=利息负; } } } System.out.println(“日”+mth+“余额”+余额); 交易=虚假;,java,double,Java,Double,以上是我代码的一部分。我的代码的其余部分从文本文件中读取数据,在double值应该减去500.0的部分之前,一切都正常 第22天余额225.86301881168654 第23天余额0.5478672869645392 第22天之后,应该是-275.54。。。。。。但它却展示了它现在所展示的东西。这是我任务的最后一部分,我被困在这里好几个小时寻找解决方案!提前感谢您的帮助 编辑:我已经输入了更多的代码,当225.86301881168654-500.0成为我得到的奇怪结果时,java是如何处理二
编辑:我已经输入了更多的代码,当225.86301881168654-500.0成为我得到的奇怪结果时,java是如何处理二进制形式的数学运算的问题吗?我不知道确切的问题是什么,但使用(而不是
double
)当使用金钱时。我不知道确切的问题是什么,但在使用金钱时使用(而不是使用double
)。很难说当我们看不到您的全部代码时会发生什么,但这些更改应该对您有所帮助:
double interest_pos = 1.0003, interest_neg = -0.002;
double balance = CustomersList.getItem(i).get_balance();
boolean transacted = false;
for ( int mth = 1; mth <= 31; mth++ )
{
System.out.println(balance);
for ( int j = 1; j <= numTrans; j++ )
{
if ( CustomersList.getItem(i).get_accountid() == TransList.getItem(j).get_accountid() )
{
String tempdate = TransList.getItem(j).get_date();
date = tempdate.split(delimiter);
if ( TransList.getItem(j).get_type().equals("credit") && Integer.parseInt(date[0]) == mth && !transacted )
{
balance += TransList.getItem(j).get_amount();
transacted = true;
if ( balance >= 0 ) balance *= interest_pos;
else balance *= interest_neg;
}
else if ( TransList.getItem(j).get_type().equals("credit") && Integer.parseInt(date[0]) == mth && transacted )
{
balance += TransList.getItem(j).get_amount();
}
else if ( TransList.getItem(j).get_type().equals("debit") && Integer.parseInt(date[0]) == mth && transacted )
{
System.out.println( "Deducted " + TransList.getItem(j).get_amount());
balance -= TransList.getItem(j).get_amount();
}
else if ( TransList.getItem(j).get_type().equals("debit") && Integer.parseInt(date[0]) == mth && !transacted )
{
balance -= TransList.getItem(j).get_amount();
transacted = true;
if ( balance >= 0 ) balance *= interest_pos;
else balance *= interest_neg;
}
else
{
if ( balance >= 0 ) balance *= interest_pos;
else balance *= interest_neg;
}
}
}
System.out.println ("Day " + mth + " Balance " + balance );
transacted = false;
很难说当我们看不到您的全部代码时会发生什么,但这些更改应该对您有所帮助:
double interest_pos = 1.0003, interest_neg = -0.002;
double balance = CustomersList.getItem(i).get_balance();
boolean transacted = false;
for ( int mth = 1; mth <= 31; mth++ )
{
System.out.println(balance);
for ( int j = 1; j <= numTrans; j++ )
{
if ( CustomersList.getItem(i).get_accountid() == TransList.getItem(j).get_accountid() )
{
String tempdate = TransList.getItem(j).get_date();
date = tempdate.split(delimiter);
if ( TransList.getItem(j).get_type().equals("credit") && Integer.parseInt(date[0]) == mth && !transacted )
{
balance += TransList.getItem(j).get_amount();
transacted = true;
if ( balance >= 0 ) balance *= interest_pos;
else balance *= interest_neg;
}
else if ( TransList.getItem(j).get_type().equals("credit") && Integer.parseInt(date[0]) == mth && transacted )
{
balance += TransList.getItem(j).get_amount();
}
else if ( TransList.getItem(j).get_type().equals("debit") && Integer.parseInt(date[0]) == mth && transacted )
{
System.out.println( "Deducted " + TransList.getItem(j).get_amount());
balance -= TransList.getItem(j).get_amount();
}
else if ( TransList.getItem(j).get_type().equals("debit") && Integer.parseInt(date[0]) == mth && !transacted )
{
balance -= TransList.getItem(j).get_amount();
transacted = true;
if ( balance >= 0 ) balance *= interest_pos;
else balance *= interest_neg;
}
else
{
if ( balance >= 0 ) balance *= interest_pos;
else balance *= interest_neg;
}
}
}
System.out.println ("Day " + mth + " Balance " + balance );
transacted = false;
我建议您使用调试器一步一步地检查代码,您将看到您的值实际上是如何变化的 你的负利息是利息负=-0.002。乘以你的数量 假设你有以下情况
double balance;
System.out.println(balance);
balance -= TransList.getItem(j).get_amount();
System.out.println(balance);
transacted = true;
if ( balance >= 0 ) balance *= interest_pos;
else balance *= interest_neg;
System.out.println(balance);
正如您所看到的,负利息对该值没有任何意义。如果我有一百万美元的债务,下个月我就会有200美元。我欠的债越多,下个月就有越多的钱
所以,每当你有一个负的平衡,你是使它再次积极。也许你的消极兴趣应该是1.002,类似于你的积极兴趣
double balance = -100;
if ( balance >= 0 ) balance *= interest_pos;
else balance *= interest_neg; // balance = -100 * -0.002 = +0.2
我建议您使用调试器一步一步地检查代码,您将看到您的值实际上是如何变化的 你的负利息是利息负=-0.002。乘以你的数量 假设你有以下情况
double balance;
System.out.println(balance);
balance -= TransList.getItem(j).get_amount();
System.out.println(balance);
transacted = true;
if ( balance >= 0 ) balance *= interest_pos;
else balance *= interest_neg;
System.out.println(balance);
正如您所看到的,负利息对该值没有任何意义。如果我有一百万美元的债务,下个月我就会有200美元。我欠的债越多,下个月就有越多的钱
所以,每当你有一个负的平衡,你是使它再次积极。也许你的消极兴趣应该是1.002,类似于你的积极兴趣
double balance = -100;
if ( balance >= 0 ) balance *= interest_pos;
else balance *= interest_neg; // balance = -100 * -0.002 = +0.2
我在整个“负双”变量问题上表现得非常糟糕,因为总金额肯定是负的。执行IF语句,如果第二个变量>第一个变量,它将翻转变量,然后乘以-1。但那没用。。。。double实际上计算得很完美……我在代码下面有一个布尔语句,它只寻找正数。它使我不用重写几十个变量。我希望这能帮助一些人。我对整个“负双精度”变量问题感到非常恼火,因为总数肯定是负数。执行IF语句,如果第二个变量>第一个变量,它将翻转变量,然后乘以-1。但那没用。。。。double实际上计算得很完美……我在代码下面有一个布尔语句,它只寻找正数。它使我不用重写几十个变量。我希望这对某人有所帮助。尝试发布完整的代码-您正在使用未在发布的代码段中初始化的
balance
。请发布一个显示错误的最小完整程序。它不仅帮助我们帮助你,但通常在这样做的过程中,你自己会发现错误。兴趣的值是多少?兴趣的值不会变成负值才生效。@Erik你觉得这段代码更好吗?试着发布完整的代码-你在发布的代码段中使用的是未初始化的余额。请发布一个最小的完整程序这就显示了错误。这不仅有助于我们帮助您,而且在这样做的过程中,您经常会自己发现错误。兴趣值是多少?兴趣值不会变成负值,以便兴趣值生效。@Erik您使用此代码感觉更好吗?+1“在美元和美分的计算中使用浮点是一种灾难。浮点数最适合用于测量值之类的值,因为测量值从根本上讲是不精确的。”@Jason-去掉所有double
变量,用BigDecimal
+1”替换它们使用浮点数进行美元和美分计算会带来灾难。浮点数最好是保留给测量值之类的值,因为测量值从根本上讲是不精确的。”@Jason-去掉所有double
变量,用BigDecimal