我正在尝试创建一个简单的循环来添加分数
double sum = 0;
for (int i=1; i<=20; i++) {
sum += 1/(i+2);
}
return sum;
但似乎Java不了解分数?有人能告诉我什么是错的吗?
答案 0 :(得分:3)
它正在进行整数除法,将其加倍
sum += (double)1 / (i + 2);
答案 1 :(得分:1)
最重要的是,使用浮点变量(例如java中的float或double)总是很危险的,因为它们在二进制系统中的有限表示。例如:
double a = 1.000001;
double b = 2.0000001;
System.out.println(a+b);
将打印3.0000010999999995
在您的代码中,表达式
1/(i+2)
被视为整数的除法,1/3的结果被视为0.表达式1和(i + 2)都是整数。为了获得更精确的结果,您应该知道任何操作结果将以“最需要的精度”返回。这是 - 如果你的一个表达式是更精确的类型 - 例如long,float,double,那么结果值将是给定的最精确类型。例如:
(2+3L) - expression result will be of long type
(2+2.1) - expression result will be of double type
(2.1f+2.0d) - expression result will be of double type
(L代表长型)
您可以通过多种方式在Java中表达浮点文字:
另一个重要的事情是没有后缀的默认表示。默认情况下它是双,所以示例:
float a = 1.2;
甚至不会编译,因为这样的分配将涉及有损转换和编译器需要程序员的明确意图(这通常通过向值或转换值添加后缀来完成)。
答案 2 :(得分:0)
因为整数i
,1/(i+2)
也会生成一个整数。
你只需要像这样使用转换加倍:
sum += 1.0d/(i+2);
当你写1.0d
或(double)1
时,你将数字加倍。
然后该分数将产生双倍,并将正确分配给sum
。