java.pow()结果不准确

时间:2012-01-22 03:39:04

标签: java math floating-point

我试图取两个数字并得到它们的平方。使用几个数字一些工作,但这一个给我问题pow(.0305,2)。使用计算器我得到的回答:0.093025;但是当我使用java时,我得到了一个答案:9.609999999999999E-4。我需要.0305,因为我服用的是3.05 / 100,即.0305。

我通过试验发现,如果我做.pow(.305,2),这确实给了我需要答案,但是我必须得到3.05 / 100。

编辑:(添加代码)

double weight=3.05;
double TapeLength=100.00;
double ftwt= weight/TapeLength; this gives me: 0.093025
double ftwt= Math.pow(ftwt,2); //this gives me: 9.3025E-4 

一切都是双重的。

3 个答案:

答案 0 :(得分:4)

如果你真的得到9.609999999999999E-4,那么除了你提出的问题之外,你做错了。以下代码(在Eclipse 3.7.1中):

class Test {
    public static void main(String args[]) {
        double dd = .0305;
        System.out.println (Math.pow(dd, 2));
        System.out.println ("%.8f\n", Math.pow(dd, 2));
    }
}  

产生

9.3025E-4
0.00093025

两者正确(a),只是用不同的输出格式表示。在这种情况下,double的默认值是指数格式,但最后一行显示了如何获得不同的格式。


(a)如果您对指数形式感到困惑(基于您的评论),0.00093025 与相同9.3025E-4因为后者意味着9.3025 x 10-49.3025,小数点向左移动了四个位置。

答案 1 :(得分:0)

除了数量级的问题,我认为这只是一个打字错误,如果你担心你得到0.00096xxxxx,你应该从开始指定它们为double。你正在使它们浮动,这意味着你失去了精确度,只有这样它们才能被加倍。然后通过平方来加剧错误。

使它们成为双打可能会有所帮助,但你必须记住,当你处理十进制有理数的二进制表示时,可能没有一个具有有限位数的精确表示。

答案 2 :(得分:0)

使用Math.pow(x, 2)比使用x * x慢得多,这是因为它与Math.exp(Math.log(x) * n)相同,因为它会进行更多的计算,因此往往会出现更大的舍入误差。 (所以这是一个坏主意恕我直言)