2011-05-19 43 views
3
double radius = 5; 
double area = Math.PI * Math.pow(radius, 2);    
// System.out.println(area); 

BigDecimal bd = new BigDecimal(area).setScale(2, HALF_UP); 
// BigDecimal bd = new BigDecimal(area).setScale(2, ROUND_HALF_UP); 
System.out.println(bd.toString()); 

上述输出被打印为78.54得到,但如果我通过计算器(窗口计算值接口)执行相同的操作的输出出来作为78.57(即22/7 * 25)。不同结果而舍入小数

为什么会出现

+55

这只是:pi实际上不是22/7。 – 2011-05-19 09:31:07

+0

如果我在calc.exe中执行PI * 25,我得到78.539 ...,即四舍五入为78.54 – Thomas 2011-05-19 09:33:04

+3

当我在小学时,我们的老师告诉我们,PI的定义是22/7。可悲的是,我直到14岁时才相信这一点。我童年时最大的创伤。 – 2011-05-19 09:59:23

回答

20

您是否使用22/7作为PI的近似值的不一致?因为22/73.142857142857...其中PI大约是3.14159...。这解释了舍入不一致。

在JVM中使用的PI的近似值记录为here。按照JavaDoc,它是:

值,该值比任何其他PI接近

+1

那么究竟是什么PI,我应该假设Math.PI给我正确的值而不是22/7 – Joe 2011-05-19 09:33:15

+2

是的,它的值是'3.141592653589793' [truncated],你可以尝试'3.141592653589793 * 25'in'calc' – 2011-05-19 09:34:45

+2

@Joe,因为PI是一个常数,我假设它只是存储到一些精度设置。没有必要计算一个不能改变的常数(也计算它也会有性能打击,尽管通常无法衡量)。 – Thomas 2011-05-19 09:35:08

6

22/7是近似PI,它不准确,所以结果

+4

你也可以使用3;它不是一个近似值的差,而且更容易用 – flq 2011-05-19 09:55:42

+3

来计算你是否提前提交了? – BoltClock 2011-05-19 10:03:03

1

几乎完全脱离主题(及其javascript)。但对于实际上看到PI被计算出来,它仍然是一个有趣的答案。

这种方法显然超级超慢计算PI ...但有点看起来很有趣。

(function (t) { 
    (function() { 
     var a = 0, 
      b = 1, 
      d = 4, 
      c = ~1e9; 
     (function p() { 
      if (!t) { 
       return; 
      } 
      b -= 2; 
      a -= d/b; 
      d = -d; 
      if (++c % 2000 === 0) { 
       t.innerHTML = a; 
       setTimeout(p, 13); 
      } else { 
       if (c) { 
        p(); 
       } else { 
        t.innerHTML = a; 
       } 
      } 
     }()); 
    }()); 
}(document.getElementById("someplace-to-hold-the-calculation"))) 

Philippe Leybaert成立了JSBin for it

+1

很酷。这里是你的函数的实时演示:http:// jsbin。com/awupo4 – 2011-05-19 14:25:08

+0

+1和谢谢,我已将它添加到答案中。 – 2011-05-19 14:45:37

+0

我实际上在加载消息时有时使用这个函数。像这样:'计算PI到无穷大,请等待...... 3.14'。我还使用“网状花键”,“它比你绘制的速度还快”,以及“请稍等(如同你有其他选择一样)”。 :-D – 2011-05-19 14:50:36