这个除法有什么问题?

3
这里是代码:

class testsum
{ 
    public static void main(String arg[]) 
    {
        double sum=0; 
        double fraction;
        fraction=-1/9;
        System.out.println("fraction: "+fraction); 
        fraction=-1; 
        fraction=fraction/9; 
        System.out.println("fraction: "+fraction); 
    } 
} 

输出结果为0-0.11111111

为什么第一个输出结果是0而不是-0.11111111111


老兄...这个问题已经四年了。 - David
6个回答

8

在第一个示例中,它执行整数除法,因为这是数字文字的默认类型。尝试将其更改为-1.0/9(或1d/9d - d后缀表示double),您应该得到相同的答案。


它执行整数除法,即使该值将存储在类型为double的变量中? - David
1
除法发生在它知道它将成为双精度浮点数之前。它首先以整数形式执行除法,然后意识到必须转换为双精度浮点数。自纪元以来,这一问题已经成为许多错误的根源。 - corsiKa
是的,它没有考虑到这一点(正确或错误地!) - Jeff Foster

2

1和9都是整数。试试:

1.0/9

这就是为什么对于 fraction/9 起作用的原因,因为 fraction 是一个双精度浮点数。

1

当你执行-1/9时,它会说“-1是整数。9是整数。在整数除法中,-1/9等于0。哦,现在我需要转换为double类型。”

将其更改为-1.0 / 9应该可以解决这个问题。


0
第一个值是0,因为它进行了整数除法。-1和9都是整数,当进行除法计算时结果等于0。然后将其转换为double类型,以便在fraction中存储。最简单的解决方案是:
fraction = -1.0/9;

0

尝试将“-1/9”用括号括起来。


0

因为-19都是整数,所以-1/9是一个整数除法(结果为0,当转换为双精度时为0.0)。

要进行浮点数除法,您应该将其中一个数字转换为双精度,(double) 99d或者简单地使用9.0

在后一种情况下,fraction已经是双精度(-1.0),所以fraction/9是一个浮点数除法。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接