天天看點

BigDecimal的簡單學習

<code>package</code> <code>com.hanchao.test;</code>

<code>import</code> <code>java.math.BigDecimal;</code>

<code>/***********************</code>

<code> </code><code>* BigDecimal的簡單學習測試</code>

<code> </code><code>* @author:han   </code>

<code> </code><code>* @version:1.0       </code>

<code> </code><code>* @created:2013-11-11   </code>

<code> </code><code>***********************</code>

<code> </code><code>*/</code>

<code>public</code> <code>class</code> <code>TestBigDecmal {</code>

<code>      </code> 

<code>    </code><code>/**</code>

<code>        </code><code>一提到Java裡面的商業計算,我們都知道不能用float和double,因為他們無法進行精确計算。</code>

<code>        </code><code>但是Java的設計者給程式設計人員提供了一個很有用的類BigDecimal,</code>

<code>        </code><code>他可以完善float和double類無法進行精确計算的缺憾。</code>

<code>     </code><code>*/</code>

<code>     </code><code>* ava.math.BigDecimal。BigDecimal一共有4個夠造方法,讓我先來看看其中的兩種用法:</code>

<code>        </code><code>第一種:BigDecimal(double val)</code>

<code>        </code><code>Translates a double into a BigDecimal.</code>

<code>          </code> 

<code>        </code><code>第二種:BigDecimal(String val)</code>

<code>        </code><code>Translates the String repre sentation of a BigDecimal into a BigDecimal.</code>

<code>        </code><code>很多人會問到怎麼将基本類型,如int,float,double,long,和BigDecimal對象互相轉換。很簡單:</code>

<code>        </code><code>基本類型通過構造函數轉換成對應的BigDecimal對象,</code>

<code>        </code><code>而BigDecimal類提供了諸如intValue(), floatValue(),</code>

<code>         </code><code>doubleValue(), longValue()方法來将BigDecimal對象轉換成對應的值。</code>

<code>    </code><code>public</code> <code>static</code> <code>void</code> <code>main(String[] args) {</code>

<code>        </code><code>BigDecimal b1 = </code><code>new</code> <code>BigDecimal(</code><code>"9.111"</code><code>);</code>

<code>        </code><code>System.out.println(</code><code>" b1: "</code> <code>+ b1);   </code><code>// b1: 9.111</code>

<code>        </code><code>System.out.println(</code><code>" b1: 變形:"</code> <code>+ b1.intValue());</code><code>// b1: 變形:9</code>

<code>        </code><code>BigDecimal b2 = </code><code>new</code> <code>BigDecimal(</code><code>9</code><code>.111d);</code>

<code>        </code><code>System.out.println(</code><code>" b2: "</code> <code>+ b2); </code><code>// b2: 9.111000000000000653699316899292171001434326171875</code>

<code>        </code><code>System.out.println(</code><code>" b2: 變形:"</code> <code>+ b2.doubleValue()); </code><code>// b2: 變形:9.111</code>

<code>        </code><code>BigDecimal b3 = </code><code>new</code> <code>BigDecimal(</code><code>9</code><code>);</code>

<code>        </code><code>System.out.println(</code><code>" b3: "</code> <code>+ b3); </code><code>// b3: 9</code>

<code>        </code><code>System.out.println(</code><code>" b3: 變形:"</code> <code>+ b3.intValue());</code><code>// b3: 變形:9</code>

<code>        </code><code>BigDecimal b4 = </code><code>new</code> <code>BigDecimal(</code><code>9</code><code>.111f);</code>

<code>        </code><code>System.out.println(</code><code>" b4: "</code> <code>+ b4);</code><code>// b4: 9.11100006103515625</code>

<code>        </code><code>System.out.println(</code><code>" b4: 變形:"</code> <code>+ b4.floatValue()); </code><code>// b4: 變形:9.111</code>

<code>        </code><code>BigDecimal b5 = </code><code>new</code> <code>BigDecimal(900L);</code>

<code>        </code><code>System.out.println(</code><code>" b5: "</code> <code>+ b5); </code><code>// b5: 900</code>

<code>        </code><code>System.out.println(</code><code>" b5: 變形:"</code> <code>+ b5.longValue());</code><code>// b5: 變形:900</code>

<code>        </code><code>/**</code>

<code>         </code><code>* 1.精确加法運算</code>

<code>         </code><code>*/</code>

<code>        </code><code>double</code> <code>r1 = add(</code><code>1.1</code><code>, </code><code>2.9912</code><code>);</code>

<code>        </code><code>System.out.println(</code><code>" r1 : "</code> <code>+ r1); </code><code>//  r1 : 4.0912</code>

<code>        </code><code>double</code> <code>r2 = </code><code>1.1</code> <code>+ </code><code>2.9912</code><code>;</code>

<code>        </code><code>System.out.println(</code><code>" r2 : "</code> <code>+ r2); </code><code>// r2 : 4.091200000000001</code>

<code>         </code><code>* 2.精确減法運算</code>

<code>        </code><code>double</code> <code>r3 = sub(</code><code>2.002</code><code>, </code><code>0.112</code><code>);</code>

<code>        </code><code>System.out.println(</code><code>" r3: "</code> <code>+ r3); </code><code>// r3: 1.89</code>

<code>        </code><code>double</code> <code>r4 = </code><code>2.002</code> <code>- </code><code>0.112</code><code>;</code>

<code>        </code><code>System.out.println(</code><code>" r4: "</code> <code>+ r4);</code><code>// r4: 1.8899999999999997</code>

<code>         </code><code>* 3.精确乘法運算</code>

<code>        </code><code>double</code> <code>r5 = mul(</code><code>2.002</code><code>, </code><code>1.001</code><code>);</code>

<code>        </code><code>System.out.println(</code><code>" r5: "</code> <code>+ r5);</code><code>// r5: 2.004002</code>

<code>        </code><code>double</code> <code>r6 = </code><code>2.002</code> <code>* </code><code>1.001</code><code>;</code>

<code>        </code><code>System.out.println(</code><code>" r6: "</code> <code>+ r6);</code><code>// r6: 2.0040019999999994</code>

<code>         </code><code>* 4.提供相對精确的除法運算</code>

<code>        </code><code>double</code> <code>r7 = div(</code><code>3.4</code><code>, </code><code>0.055</code><code>, </code><code>2</code><code>);</code>

<code>        </code><code>System.out.println(</code><code>" r7: "</code> <code>+ r7); </code><code>// r7: 61.82</code>

<code>        </code><code>double</code> <code>r8 = </code><code>3.4</code> <code>/ </code><code>0.055</code><code>;</code>

<code>        </code><code>System.out.println(</code><code>" r8: "</code> <code>+ r8);</code><code>// r8: 61.81818181818181</code>

<code>         </code><code>* 5.四舍五入處理</code>

<code>        </code><code>double</code> <code>s1 = round(</code><code>2.12512</code><code>,</code><code>3</code><code>);</code>

<code>        </code><code>System.out.println(</code><code>" s1: "</code> <code>+ s1);</code><code>// s1: 2.125</code>

<code>        </code><code>double</code> <code>s2 = round(</code><code>2.12512</code><code>, </code><code>2</code><code>);</code>

<code>        </code><code>System.out.println(</code><code>" s2: "</code> <code>+ s2);</code><code>// s2: 2.13</code>

<code>    </code><code>}</code>

<code>     </code><code>* 提供精确的加法運算</code>

<code>     </code><code>* *******************</code>

<code>     </code><code>* @author: han</code>

<code>     </code><code>* 2013-11-11</code>

<code>     </code><code>* @param v1    被加數</code>

<code>     </code><code>* @param v2    加數</code>

<code>     </code><code>* @return      兩個參數的和</code>

<code>    </code><code>public</code> <code>static</code> <code>double</code> <code>add(</code><code>double</code> <code>v1, </code><code>double</code> <code>v2) {</code>

<code>        </code><code>BigDecimal b1 = </code><code>new</code> <code>BigDecimal(Double.toString(v1));</code>

<code>        </code><code>BigDecimal b2 = </code><code>new</code> <code>BigDecimal(Double.toString(v2));</code>

<code>        </code><code>double</code> <code>result = b1.add(b2).doubleValue();</code>

<code>        </code><code>return</code> <code>result;</code>

<code>     </code><code>* 提供精确的減法運算</code>

<code>     </code><code>* @param v1    被減數</code>

<code>     </code><code>* @param v2    減數</code>

<code>     </code><code>* @return      兩個參數的差</code>

<code>    </code><code>public</code> <code>static</code> <code>double</code> <code>sub(</code><code>double</code> <code>v1, </code><code>double</code> <code>v2) {</code>

<code>        </code><code>return</code> <code>b1.subtract(b2).doubleValue();</code>

<code>     </code><code>* 提供精确的乘法運算</code>

<code>     </code><code>* @param v1    被乘數</code>

<code>     </code><code>* @param v2    乘數</code>

<code>     </code><code>* @return      兩個參數的乘機</code>

<code>    </code><code>public</code> <code>static</code> <code>double</code> <code>mul(</code><code>double</code> <code>v1, </code><code>double</code> <code>v2) {</code>

<code>        </code><code>return</code> <code>b1.multiply(b2).doubleValue();</code>

<code>     </code><code>* 提供(相對)精确的除法運算,當發生除不盡的情況時,由scale參數指定精度,以後的數字四舍五入</code>

<code>     </code><code>* @param v1    被除數</code>

<code>     </code><code>* @param v2    除數</code>

<code>     </code><code>* @param scale 表示要精确到小數點後幾位</code>

<code>     </code><code>* @return  兩個參數的商</code>

<code>    </code><code>public</code> <code>static</code> <code>double</code> <code>div(</code><code>double</code> <code>v1, </code><code>double</code> <code>v2, </code><code>int</code> <code>scale) {</code>

<code>        </code><code>if</code><code>(scale &lt; </code><code>0</code><code>) {</code>

<code>            </code><code>throw</code> <code>new</code> <code>IllegalArgumentException(</code><code>"The scale must be a positive integer or zero"</code><code>);</code>

<code>        </code><code>}</code>

<code>        </code><code>return</code> <code>b1.divide(b2,scale,BigDecimal.ROUND_HALF_UP).doubleValue();</code>

<code>     </code><code>* 提供精确的小數四舍五入處理</code>

<code>     </code><code>* @param v     需要四舍五入的數字</code>

<code>     </code><code>* @param scale 小數點後保留幾位</code>

<code>     </code><code>* @return      四舍五入後的結果</code>

<code>    </code><code>public</code> <code>static</code> <code>double</code> <code>round(</code><code>double</code> <code>v,</code><code>int</code> <code>scale) {</code>

<code>        </code><code>if</code><code>(scale &lt; </code><code>0</code> <code>) {</code>

<code>        </code><code>BigDecimal b = </code><code>new</code> <code>BigDecimal(Double.toString(v));</code>

<code>        </code><code>BigDecimal one = </code><code>new</code> <code>BigDecimal(</code><code>"1"</code><code>);</code>

<code>        </code><code>return</code> <code>b.divide(one,scale,BigDecimal.ROUND_HALF_UP).doubleValue();</code>

<code>}</code>

<code>         </code><code>* 比較大小</code>

<code>         </code><code>* 兩個BigDecimal值比較使用compareTo方法, 比較結果有-1, 0, 1, </code>

<code>         </code><code>分别表示小于, 等于, 大于; 對于0, 可以使用BigDecimal.ZERO表示!</code>

<code>        </code><code>BigDecimal num = </code><code>new</code> <code>BigDecimal(</code><code>"-5"</code><code>);</code>

<code>        </code><code>BigDecimal num1 = </code><code>new</code> <code>BigDecimal(</code><code>"-4"</code><code>);</code>

<code>        </code><code>if</code> <code>(num.compareTo(BigDecimal.ZERO) == -</code><code>1</code><code>) {</code>

<code>            </code><code>System.out.println(</code><code>"num小于0"</code><code>);</code>

<code>        </code><code>} </code><code>else</code> <code>if</code> <code>(num.compareTo(BigDecimal.ZERO) == </code><code>1</code><code>) {</code>

<code>            </code><code>System.out.println(</code><code>"num大于0"</code><code>);</code>

<code>        </code><code>} </code><code>else</code> <code>if</code><code>(num.compareTo(BigDecimal.ZERO) == </code><code>0</code><code>) {</code>

<code>            </code><code>System.out.println(</code><code>"num等于0"</code><code>);</code>

<code></code>

     本文轉自韓立偉 51CTO部落格,原文連結:http://blog.51cto.com/hanchaohan/1323228,如需轉載請自行聯系原作者