在Java中添加分数

时间:2013-11-18 20:22:57

标签: java

我正在尝试创建一个简单的循环来添加分数

double sum = 0;
for (int i=1; i<=20; i++) {
    sum += 1/(i+2);
}
return sum;

但似乎Java不了解分数?有人能告诉我什么是错的吗?

3 个答案:

答案 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中表达浮点文字:

  1. float 精度的值可以用加后缀“f”或“F”表示,即浮点数a = 1.2f
  2. double 精度的值可以通过添加后缀'd'或'D'来表示,即double a = 2.3D
  3. 除了后缀之外,值类型可以使用(float)或(double)运算符 casted 到所需类型,即float a =(float)1.2;
  4. 另一个重要的事情是没有后缀的默认表示。默认情况下它是,所以示例:

    float a = 1.2;
    

    甚至不会编译,因为这样的分配将涉及有损转换和编译器需要程序员的明确意图(这通常通过向值或转换值添加后缀来完成)。

答案 2 :(得分:0)

因为整数i1/(i+2)也会生成一个整数。 你只需要像这样使用转换加倍:

sum += 1.0d/(i+2);

当你写1.0d(double)1时,你将数字加倍。 然后该分数将产生双倍,并将正确分配给sum