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