Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/395.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 为什么值I';我在下面两个类似的程序中变得不同了,尽管我只是更改了方法的类型';s值_Java_Methods - Fatal编程技术网

Java 为什么值I';我在下面两个类似的程序中变得不同了,尽管我只是更改了方法的类型';s值

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 =

代码1: 第一类

第二类

输出:

本期余额:327 当前费率:5 余额为327.00马来西亚令吉

代码2: 第一类

第二类

输出:

当前余额:170.0 现行汇率:5.0 余额为178.50马来西亚令吉


结论:第一个程序不会改变天平的最终值,而第二个程序会改变天平的最终值。这是什么原因?我只是将变量的类型从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;