Java 为什么值I';我在下面两个类似的程序中变得不同了,尽管我只是更改了方法的类型';s值
代码1: 第一类 第二类 输出: 本期余额:327 当前费率:5 余额为327.00马来西亚令吉 代码2: 第一类 第二类 输出: 当前余额:170.0 现行汇率:5.0 余额为178.50马来西亚令吉Java 为什么值I';我在下面两个类似的程序中变得不同了,尽管我只是更改了方法的类型';s值,java,methods,Java,Methods,代码1: 第一类 第二类 输出: 本期余额:327 当前费率:5 余额为327.00马来西亚令吉 代码2: 第一类 第二类 输出: 当前余额:170.0 现行汇率:5.0 余额为178.50马来西亚令吉 结论:第一个程序不会改变天平的最终值,而第二个程序会改变天平的最终值。这是什么原因?我只是将变量的类型从int改为double,仅此而已。这是因为在第一次使用时: 积分2=5 在你的第二天,你有: 双速率2=5 在处理货币类型值时,应该使用double。在第一种情况下 int balance =
结论:第一个程序不会改变天平的最终值,而第二个程序会改变天平的最终值。这是什么原因?我只是将变量的类型从int改为double,仅此而已。这是因为在第一次使用时: 积分2=5 在你的第二天,你有: 双速率2=5
在处理货币类型值时,应该使用double。在第一种情况下
int balance = 327;
int rate = 5;
balance += balance * (rate / 100);
当你在int
上除法时,结果也是int,所以除法的结果rate/100
是(int)rate/100
给出的(int)0.05
是0
。这就是为什么平衡在第一个程序中没有改变的原因
当您将变量和参数更改为双精度时没有截断值,因此所有计算都按预期进行。这是初学者的经典问题。我很惊讶我找不到一个很好的解释。这个有点帮助: 在Java中,除法(
/
)等运算的执行方式取决于操作数的类型。在a/b
中a
和b
是操作数。如果将整数除以整数,它将执行整数除法。这意味着取整数部分并丢弃剩余部分。在该方法中,(56/100)==0
,但(156/100)==1
无舍入
要强制执行浮点运算,请确保其中一个操作数是双精度的,例如,请尝试:
void addInterest(int rate) {
balance += balance*(rate/100.0);
}
编译器将100.0
解释为double
,然后用浮点运算(可能是您期望的)执行计算,然后将整数值添加到余额中
脚注1:切勿对货币值使用double
。使用java.math.BigDecimal
在double
算法中存在许多舍入异常,这些异常会导致财务计算中出现问题double
无法精确表示0.01
,当(0.01+0.01+0.01+0.01+0.01)时,累积舍入误差不可避免地会造成一些混乱=例如,0.06。
你可以用宽容来敷衍它,但在任何实际规模的金融体系中,你最终都会超越它
脚注2:为什么Java会这样工作?整数算法对许多算法都很有用,在循环中执行数百万次增量将永远不会像我们在上面的6次操作后看到的那样“漂移”
第一个程序不会更改余额的最终值
而第二个项目是。这是什么原因
这一切都是关于双精度与整数运算。
void addInterest(double rate) {
balance += balance*(rate/100);
}
在第二个程序中,当您调用addInterest(double rate)
时,从main()
传递的rate
值将类型转换为double
变量(这是由addInterest
方法签名定义的类型),然后balance*(rate/100)
将按如下方式计算:
当费率
为双倍
时:
比率/100=5/100=0.05
但是,当速率
为整数
时:
速率/100=5/100=0(整数去除所有小数)如果将两个变量声明为整数并将其除以:
int a = 4;
int b = 5;
System.out.println(a / b);
你得不到0.8分
在Java中,整数除以整数始终是整数,因为数学结果0.8不是整数,所以向下舍入得到0。如果要得到0.8的结果,需要将a或b设为双精度
在代码1中,您的addInterest
方法获得的参数值为5
,发生以下情况:
balance += balance*(rate/100);
由于rate
和100
都是整数,因此结果必须是整数。因此,数学结果0.05向下舍入为0。我们都知道,任何乘以0的东西都是0。因此,在计算右侧之后,赋值语句如下所示:
balance += 0;
你为什么不做一个标题,然后把问题放在正文里?我真不明白你为什么要把同一个类粘贴两次。您可以只写更改的行。问题完全在于表达式rate/100
。当<代码>率是<代码> int <代码>值5时,该表达式的值为0,因为该除法是在整数运算中执行的。虽然您可以将其视为“仅”,但您不觉得有小数和不能用的东西之间可能存在差异吗?我是在你提到后才意识到的。这正是问题中所说的变化。没有任何解释为什么,即使有投票权,这有什么用?
void addInterest(double rate) {
balance += balance*(rate/100);
}
int a = 4;
int b = 5;
System.out.println(a / b);
balance += balance*(rate/100);
balance += 0;