双重操纵麻烦

时间:2012-12-14 10:37:36

标签: java

假设n是Double类型变量。

double right=n-(Math.ceil(n)-1);

//Here I am trying to get the right part of the number.

现在,如果n=1234.78

然后right=0.7799999999999727

为什么不.78

以及何时

n=1234.89

然后right=0.8900000000001

为什么不89?为什么不9999 ...而不是000000 ......?

现在假设我想在右边找到数字的总和。就像我的例子中的1234.89一样,它的8 + 9 = 17或1234.781,它的7 + 8 + 1-16。那么呢?我该怎么办?

但我不能使用浮点算术吗?喜欢

double temp=0.0; 
while(right>0) 
{ 
right=rigth*10; 
temp=Math.floor(right); 
right=right-temp; 
suml+=temp; 
} 

以某种方式我上面提到过? 我是java的新手。请解释我的问题。这对我来说是一个很大的帮助。谢谢。

2 个答案:

答案 0 :(得分:0)

嘿,您可以使用以下代码

    double roundTwoDecimals(double d) {
                DecimalFormat twoDForm = new DecimalFormat("#.##");
            return Double.valueOf(twoDForm.format(d));
    }
right=roundTwoDecimals(right);
    System.out.println(right);

你会得到理想的结果。

答案 1 :(得分:0)

浮点在几乎所有语言中的工作方式相同,您会看到相同的问题。如果你想要小数部分你应该使用。

double fract = n - (long) n;

我怀疑你使用的公式不适用于负数。 (而且速度较慢)

如您所见,这会产生舍入误差,因此您需要选择一个精度级别。您可以选择2位或6位数。您可以在计算时对值进行舍入,但在打印时将其舍入更为简单。

System.out.printf("%.2f%n", fract);

这将按预期打印0.780.89