Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/368.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
java.pow()结果不准确_Java_Math_Floating Point - Fatal编程技术网

java.pow()结果不准确

java.pow()结果不准确,java,math,floating-point,Java,Math,Floating Point,我试着取两个数,求它们的平方。使用几个数字做了一些工作,但这一个给了我问题pow(.0305,2)。用计算器我得到的答案是:0.093025;但是当我使用java时,我得到的答案是:9.609999999e-4。我需要.0305,因为我取的是3.05/100,也就是.0305 我通过试验发现,如果我做了.pow(.305,2),这确实给了我需要的答案,但我必须用3.05/100得到 编辑:(添加代码) 一切都被转换为双精度。除了数量级的问题,我认为这只是一个键入错误,如果您担心的是得到0.000

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

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

编辑:(添加代码)


一切都被转换为双精度。

除了数量级的问题,我认为这只是一个键入错误,如果您担心的是得到0.00096xxxxx,那么您应该从一开始就将它们指定为双精度。你让它们浮动,这意味着你失去了精度,只有这样它们才会被转换成双倍。然后,通过对它们进行平方运算,使误差更加复杂

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

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

产生:

9.3025E-4
0.00093025
它们都是正确的(a),只是用不同的输出格式表示。在本例中,
double
的默认格式是指数格式,但最后一行显示了如何获得不同的格式



(a) 你很可能会被指数形式(基于你的评论)弄糊涂,
0.00093025
9.3025E-4
是一样的,因为后者的意思是
9.3025x10-4
9.3025
,小数点向左移动四个位置。

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

请给出一些示例代码来说明问题。.0305的2次方不是0.093025,因此我不相信您在计算器上得到了该结果。另请参见标签上的信息页。您添加到问题中的代码给出了预期结果(9.3025e-4),所以我不确定问题出在哪里?用float进行计算不应该得到9.6xxx。我懒得键入尾数。修复了。我只是相信原始海报,他得到了错误的指数有效数字。它也不应该给你0.00096xxx。它应该给你0.00093025。
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