日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程语言 > java >内容正文

java

Java中BigDecimal类介绍及用法

發(fā)布時(shí)間:2025/3/12 java 51 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Java中BigDecimal类介绍及用法 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

Java中BigDecimal類介紹及用法

Java中提供了大數(shù)字(超過16位有效位)的操作類,即 java.math.BinInteger 類和 java.math.BigDecimal 類,用于高精度計(jì)算.
  其中 BigInteger 類是針對(duì)大整數(shù)的處理類,而 BigDecimal 類則是針對(duì)大小數(shù)的處理類.
  BigDecimal 類的實(shí)現(xiàn)用到了 BigInteger類,不同的是 BigDecimal 加入了小數(shù)的概念.
  float和Double只能用來做科學(xué)計(jì)算或者是工程計(jì)算;在商業(yè)計(jì)算中,對(duì)數(shù)字精度要求較高,必須使用 BigInteger 類和 BigDecimal 類,它支持任何精度的定點(diǎn)數(shù),可以用它來精確計(jì)算貨幣值.
  BigDecimal類創(chuàng)建的是對(duì)象,不能使用傳統(tǒng)的+、-、*、/等算術(shù)運(yùn)算符直接對(duì)其進(jìn)行數(shù)學(xué)運(yùn)算,而必須調(diào)用其對(duì)應(yīng)的方法.方法的參數(shù)也必須是BigDecimal類型的對(duì)象.

一、構(gòu)造BigDecimal 對(duì)象常用方法

1、方法一

BigDecimal BigDecimal(double d); //不允許使用

2、方法二

BigDecimal BigDecimal(String s); //常用,推薦使用

3、方法三

static BigDecimal valueOf(double d); //常用,推薦使用

注意:

1. double 參數(shù)的構(gòu)造方法,不允許使用!!!因?yàn)樗荒芫_的得到相應(yīng)的值,值會(huì)變大;
  2. String 構(gòu)造方法是完全可預(yù)知的: 寫入 new BigDecimal(“0.1”) 將創(chuàng)建一個(gè) BigDecimal,它正好等于預(yù)期的0.1; 因此,通常建議優(yōu)先使用 String 構(gòu)造方法;
  3. 靜態(tài)方法 valueOf(double val) 內(nèi)部實(shí)現(xiàn),仍是將 double 類型轉(zhuǎn)為 String 類型; 這通常是將 double(或float)轉(zhuǎn)化為 BigDecimal 的首選方法;

測試代碼如下:

package com.qiyuan.util;import java.math.BigDecimal;public class orderCode {public static void main(String[] args) {double d1 = 0.10334;double d2 = 1234.0;System.out.println("new BigDecimal("+d1+")=" + new BigDecimal(d1)); //此種方式絕對(duì)不允許!!!!!System.out.println("new BigDecimal("+d2+")=" + new BigDecimal(d2)); //此種方式絕對(duì)不允許!!!!!System.out.println("");System.out.println("new BigDecimal(String.valueOf("+d1+"))=" + new BigDecimal(String.valueOf(d1)));System.out.println("new BigDecimal(String.valueOf("+d2+"))=" + new BigDecimal(String.valueOf(d2)));System.out.println("");System.out.println("new BigDecimal(String.valueOf("+d1+"))=" + new BigDecimal(Double.toString(d1)));System.out.println("new BigDecimal(String.valueOf("+d2+"))=" + new BigDecimal(Double.toString(d2)));System.out.println("");System.out.println("BigDecimal.valueOf("+d1+")=" + BigDecimal.valueOf(d1));System.out.println("BigDecimal.valueOf("+d2+")=" + BigDecimal.valueOf(d2));System.out.println("");BigDecimal b1 = BigDecimal.valueOf(1);BigDecimal b2 = BigDecimal.valueOf(1.00000);System.out.println(b1.equals(b2));System.out.println(b1.compareTo(b2));}}

輸出如下:

new BigDecimal(0.10334)=0.10334000000000000130118138486068346537649631500244140625 new BigDecimal(1234.0)=1234new BigDecimal(String.valueOf(0.10334))=0.10334 new BigDecimal(String.valueOf(1234.0))=1234.0new BigDecimal(String.valueOf(0.10334))=0.10334 new BigDecimal(String.valueOf(1234.0))=1234.0BigDecimal.valueOf(0.10334)=0.10334 BigDecimal.valueOf(1234.0)=1234.0false 0

二、BigDecimal保留小數(shù)位

public static void main(String[] args) throws IllegalAccessException {BigDecimal decimal = new BigDecimal("1.12345");System.out.println(decimal);BigDecimal setScale = decimal.setScale(4,BigDecimal.ROUND_HALF_DOWN);System.out.println(setScale);BigDecimal setScale1 = decimal.setScale(4,BigDecimal.ROUND_HALF_UP);System.out.println(setScale1); }

參數(shù)定義ROUND_CEILING Rounding mode to round towards positive infinity. 向正無窮方向舍入 ROUND_DOWN Rounding mode to round towards zero. 向零方向舍入 ROUND_FLOOR Rounding mode to round towards negative infinity. 向負(fù)無窮方向舍入 ROUND_HALF_DOWN Rounding mode to round towards "nearest neighbor" unless both neighbors are equidistant, in which case round down. 向(距離)最近的一邊舍入,除非兩邊(的距離)是相等,如果是這樣,向下舍入, 例如1.55 保留一位小數(shù)結(jié)果為1.5 ROUND_HALF_EVEN Rounding mode to round towards the "nearest neighbor" unless both neighbors are equidistant, in which case, round towards the even neighbor. 向(距離)最近的一邊舍入,除非兩邊(的距離)是相等,如果是這樣,如果保留位數(shù)是奇數(shù),使用ROUND_HALF_UP ,如果是偶數(shù),使用ROUND_HALF_DOWN ROUND_HALF_UP Rounding mode to round towards "nearest neighbor" unless both neighbors are equidistant, in which case round up. 向(距離)最近的一邊舍入,除非兩邊(的距離)是相等,如果是這樣,向上舍入, 1.55保留一位小數(shù)結(jié)果為1.6 ROUND_UNNECESSARY Rounding mode to assert that the requested operation has an exact result, hence no rounding is necessary. 計(jì)算結(jié)果是精確的,不需要舍入模式 ROUND_UP Rounding mode to round away from zero. 向遠(yuǎn)離0的方向舍入

附件1,BigDecimal 類的 valueOf()方法源碼

public static BigDecimal valueOf(double val) {return new BigDecimal(Double.toString(val)); }

附件2,BigDecimal類的幾個(gè)常用方法

/*** 求余數(shù)* 返回值為 (this % divisor) 的 BigDecimal*/ BigDecimal remainder(BigDecimal divisor);/*** 求相反數(shù)* 返回值是 (-this) 的 BigDecimal*/ BigDecimal negate();/*** 將此 BigDecimal 與指定的 BigDecimal 比較* 根據(jù)此方法,值相等但具有不同標(biāo)度的兩個(gè) BigDecimal 對(duì)象(如,2.0 和 2.00)被認(rèn)為是相等的;* 相對(duì)六個(gè) boolean 比較運(yùn)算符 (<, ==, >, >=, !=, <=) 中每一個(gè)運(yùn)算符的各個(gè)方法,優(yōu)先提供此方法;* 建議使用以下語句執(zhí)行上述比較:(x.compareTo(y) <op> 0), 其中 <op> 是六個(gè)比較運(yùn)算符之一;** 指定者:接口 Comparable<BigDecimal> 中的 compareTo* 返回:當(dāng)此 BigDecimal 在數(shù)字上小于、等于或大于 val 時(shí),返回 -1、0 或 1*/ int compareTo(BigDecimal val);

附件3,提供精確的浮點(diǎn)數(shù)運(yùn)算(包括加、減、乘、除、四舍五入)的工具類源碼

package com.qiyuan.util;import java.math.BigDecimal;public class ArithUtil {// 除法運(yùn)算默認(rèn)精度 private static final int DEF_DIV_SCALE = 10; private ArithUtil() { } /** * 精確加法 */ public static double add(double value1, double value2) { BigDecimal b1 = BigDecimal.valueOf(value1); BigDecimal b2 = BigDecimal.valueOf(value2); return b1.add(b2).doubleValue(); } /** * 精確減法 */ public static double sub(double value1, double value2) { BigDecimal b1 = BigDecimal.valueOf(value1); BigDecimal b2 = BigDecimal.valueOf(value2); return b1.subtract(b2).doubleValue(); } /** * 精確乘法 */ public static double mul(double value1, double value2) { BigDecimal b1 = BigDecimal.valueOf(value1); BigDecimal b2 = BigDecimal.valueOf(value2); return b1.multiply(b2).doubleValue(); } /** * 精確除法 使用默認(rèn)精度 */ public static double div(double value1, double value2) throws IllegalAccessException { return div(value1, value2, DEF_DIV_SCALE); } /** * 精確除法 * @param scale 精度 */ public static double div(double value1, double value2, int scale) throws IllegalAccessException { if(scale < 0) { throw new IllegalAccessException("精確度不能小于0"); } BigDecimal b1 = BigDecimal.valueOf(value1); BigDecimal b2 = BigDecimal.valueOf(value2); // return b1.divide(b2, scale).doubleValue(); return b1.divide(b2, scale, BigDecimal.ROUND_HALF_UP).doubleValue(); } /** * 四舍五入 * @param scale 小數(shù)點(diǎn)后保留幾位 */ public static double round(double v, int scale) throws IllegalAccessException { return div(v, 1, scale); } /** * 比較大小 */ public static boolean equalTo(BigDecimal b1, BigDecimal b2) { if(b1 == null || b2 == null) { return false; } return 0 == b1.compareTo(b2); } public static void main(String[] args) throws IllegalAccessException {double value1=1.2345678912311;double value2=9.1234567890123;BigDecimal value3=new BigDecimal(Double.toString(value1));BigDecimal value4=new BigDecimal(Double.toString(value2));System.out.println("精確加法================="+ArithUtil.add(value1, value2));System.out.println("精確減法================="+ArithUtil.sub(value1, value2));System.out.println("精確乘法================="+ArithUtil.mul(value1, value2));System.out.println("精確除法 使用默認(rèn)精度 ================="+ArithUtil.div(value1, value2));System.out.println("精確除法 設(shè)置精度================="+ArithUtil.div(value1, value2,20));System.out.println("四舍五入 小數(shù)點(diǎn)后保留幾位 ================="+ArithUtil.round(value1, 10));System.out.println("比較大小 ================="+ArithUtil.equalTo(value3, value4));} }

總結(jié)

以上是生活随笔為你收集整理的Java中BigDecimal类介绍及用法的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。