java.pow()结果不准确



我正在尝试取两个数字,并得到它们的平方。使用几个数字是可行的,但这一个给了我问题pow(.0305,2)。使用计算器,我得到的答案是:0.093025;但当我使用java时,我得到的答案是:9.60999999999E-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 

一切都像替身。

如果结果真的得到了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 ("%.8fn", Math.pow(dd, 2));
    }
}  

生产:

9.3025E-4
0.00093025

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


(a)只是偶尔你会被指数形式弄糊涂(基于你的评论),0.000930259.3025E-4相同,因为后者的意思是9.3025 x 10-4(小数点向左移动四位的9.3025)。

除了数量级的问题,我认为这只是一个打字错误,如果你担心你得到0.00096xxxxx,你应该从一开始就把它们指定为double。你让它们浮动,这意味着你失去了精度,只有这样它们才会被铸造成双倍。然后通过对它们进行平方来使误差复合。

使它们加倍可能会有所帮助,但你必须记住,当你处理十进制理性的二进制表示时,可能没有有限位数的精确表示。

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

最新更新