2011-05-19 62 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