天天看点

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,如需转载请自行联系原作者