java BigDecimal使用(小数点,字符串等转换)
一、BigDecimal介绍
Java中提供了操作大数字(超过16位有效位)的类,
即 java.math.BigInteger 类和 java.math.BigDecimal 类,用于高精度计算。
float和Double只能用来做科学计算、工程计算等;在商业计算中,对数字精度要求较高(例如货币值),必须使用 BigInteger 类和 BigDecimal 类,它支持任何精度的定点数,可以用它来精确计算。
BigInteger | BigDecimal |
大整数 | 大小数 |
以BigDecimal为例。
BigDecimal类创建的是对象,不能使用传统的 、-、*、/ 等算术运算符进行数学运算,而必须调用它的方法。方法的参数也必须是BigDecimal类型的对象。
二、数字转换类型问题
java中,BigDecimal十分好用。各种格式的数字只要往BigDecimal里无脑丢即可。例如:
-
//字符串型
-
String num1 = "10.0";
-
BigDecimal d1 = new BigDecimal(num1);
-
int i1 = d1.intValue();
例如,别的系统给你传数据,发过来的都是字符串,其中有个字段是数量。但对方传过来的是"10.0",如果用 Integer.parseInt(num1),就会报错如下。
java.lang.NumberFormatException: For input string: "10.0"
如果要处理这种情况,按照传统的方法,就得加很多校验,判断是否有小数点,等等。但如果用BigDecimal,就很舒服。
三、BigDecimal常见问题
1.new Decimal时不允许传double
new BigDecimal()的时候,不允许传入double类型的数,通常传入String类型的数(推荐这样)。
因为double类型的数传入BigDecimal无法得到精确值。
例如:
-
BigDecimal b1 = new BigDecimal(0.1); //不允许
-
BigDecimal b2 = new BigDecimal("0.1"); //推荐
不允许传入double类型的原因:
-
BigDecimal b10 = new BigDecimal(0.1);
-
BigDecimal b11 = new BigDecimal(1.1);
-
System.out.println(b10.add(b11).doubleValue()); //输出1.2000000000000002
-
-
BigDecimal b12 = new BigDecimal("0.1");
-
BigDecimal b13 = new BigDecimal("1.1");
-
System.out.println(b12.add(b13).doubleValue()); //输出1.2
如果值是double类型, 就需要先转换成String,再传入。也可以使用 valueOf(),用法如下
BigDecimal.valueOf(0.1)
它的源码其实就是将double转string:
-
public static BigDecimal valueOf(double val) {
-
return new BigDecimal(Double.toString(val));
-
}
四、工具类
-
public class Arith {
-
-
public static double add(double value1,double value2){
-
BigDecimal b1 = new BigDecimal(Double.valueOf(value1));
-
BigDecimal b2 = new BigDecimal(Double.valueOf(value2));
-
return b1.add(b2).doubleValue();
-
}
-
-
-
public static double sub(double value1,double value2){
-
BigDecimal b1 = new BigDecimal(Double.valueOf(value1));
-
BigDecimal b2 = new BigDecimal(Double.valueOf(value2));
-
return b1.subtract(b2).doubleValue();
-
}
-
-
-
public static double mul(double value1,double value2){
-
BigDecimal b1 = new BigDecimal(Double.valueOf(value1));
-
BigDecimal b2 = new BigDecimal(Double.valueOf(value2));
-
return b1.multiply(b2).doubleValue();
-
}
-
-
-
public static double div(double value1,double value2,int scale) throws IllegalAccessException{
-
if(scale<0){
-
throw new IllegalAccessException("精确度不能小于0");
-
}
-
BigDecimal b1 = new BigDecimal(Double.valueOf(value1));
-
BigDecimal b2 = new BigDecimal(Double.valueOf(value2));
-
return b1.divide(b2, scale).doubleValue();
-
}
-
}
五、保留小数位
ROUND_DOWN --> 直接删除多余的小数位 ,(这种方式得到的绝对值不会比原数大)
ROUND_UP --> 在最后一位直接加1,
ROUND_CEILING --> 正数时与ROUND_UP一致,负数时与ROUND_DOWN一致
ROUND_FLOOR --> 正数时与Round_DOWN一致,负数时与ROUND_UP一致
ROUND_HALF_UP --> 四舍五入
ROUND_HALF_DOWN --> 五舍六入
ROUND_HALE_EVEN --> 四舍六入五看奇进偶不进(四舍六入五成双)
参考
其他参考
=======================分割线==========================
文章到这里已经结束,以下是紫薯布丁
//字符串型
String num1 = "10.0";
BigDecimal d1 = new BigDecimal(num1);
int i1 = d1.intValue();
BigDecimal b10 = new BigDecimal(0.1);
BigDecimal b11 = new BigDecimal(1.1);
System.out.println(b10.add(b11).doubleValue()); //输出1.2000000000000002
BigDecimal b12 = new BigDecimal("0.1");
BigDecimal b13 = new BigDecimal("1.1");
System.out.println(b12.add(b13).doubleValue()); //输出1.2
public static BigDecimal valueOf(double val) {
return new BigDecimal(Double.toString(val));
}
public class Arith {
public static double add(double value1,double value2){
BigDecimal b1 = new BigDecimal(Double.valueOf(value1));
BigDecimal b2 = new BigDecimal(Double.valueOf(value2));
return b1.add(b2).doubleValue();
}
public static double sub(double value1,double value2){
BigDecimal b1 = new BigDecimal(Double.valueOf(value1));
BigDecimal b2 = new BigDecimal(Double.valueOf(value2));
return b1.subtract(b2).doubleValue();
}
public static double mul(double value1,double value2){
BigDecimal b1 = new BigDecimal(Double.valueOf(value1));
BigDecimal b2 = new BigDecimal(Double.valueOf(value2));
return b1.multiply(b2).doubleValue();
}
public static double div(double value1,double value2,int scale) throws IllegalAccessException{
if(scale<0){
throw new IllegalAccessException("精确度不能小于0");
}
BigDecimal b1 = new BigDecimal(Double.valueOf(value1));
BigDecimal b2 = new BigDecimal(Double.valueOf(value2));
return b1.divide(b2, scale).doubleValue();
}
}
这篇好文章是转载于:学新通技术网
- 版权申明: 本站部分内容来自互联网,仅供学习及演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,请提供相关证据及您的身份证明,我们将在收到邮件后48小时内删除。
- 本站站名: 学新通技术网
- 本文地址: /boutique/detail/tanhfccffe
-
photoshop保存的图片太大微信发不了怎么办
PHP中文网 06-15 -
《学习通》视频自动暂停处理方法
HelloWorld317 07-05 -
word里面弄一个表格后上面的标题会跑到下面怎么办
PHP中文网 06-20 -
Android 11 保存文件到外部存储,并分享文件
Luke 10-12 -
photoshop扩展功能面板显示灰色怎么办
PHP中文网 06-14 -
微信公众号没有声音提示怎么办
PHP中文网 03-31 -
excel下划线不显示怎么办
PHP中文网 06-23 -
excel打印预览压线压字怎么办
PHP中文网 06-22 -
TikTok加速器哪个好免费的TK加速器推荐
TK小达人 10-01 -
怎样阻止微信小程序自动打开
PHP中文网 06-13