java BigDecimal使用(小数点,字符串等转换) | 您所在的位置:网站首页 › bigdecimal转integer类型 › java BigDecimal使用(小数点,字符串等转换) |
一、BigDecimal介绍
Java中提供了操作大数字(超过16位有效位)的类, 即 java.math.BigInteger 类和 java.math.BigDecimal 类,用于高精度计算。 float和Double只能用来做科学计算、工程计算等;在商业计算中,对数字精度要求较高(例如货币值),必须使用 BigInteger 类和 BigDecimal 类,它支持任何精度的定点数,可以用它来精确计算。 BigIntegerBigDecimal大整数大小数以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时不允许传doublenew 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 直接删除多余的小数位 ,(这种方式得到的绝对值不会比原数大)ROUND_UP --> 在最后一位直接加1, ROUND_CEILING --> 正数时与ROUND_UP一致,负数时与ROUND_DOWN一致 ROUND_FLOOR --> 正数时与Round_DOWN一致,负数时与ROUND_UP一致 ROUND_HALF_UP --> 四舍五入 ROUND_HALF_DOWN --> 五舍六入 ROUND_HALE_EVEN --> 四舍六入五看奇进偶不进(四舍六入五成双) 参考 Java中BigDecimal类型数据保留小数的精度设置 java精确除法运算(BigDecimal) 其他参考 BigDecimal的用法详解(保留两位小数,四舍五入,数字格式化,科学计数法转数字,数字里的逗号处理)_bigdecimal 两位小数_liucw_cn的博客-CSDN博客 如何理解double精度丢失问题? - 知乎 =======================分割线========================== 文章到这里已经结束,以下是紫薯布丁 //字符串型 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 |
CopyRight 2018-2019 实验室设备网 版权所有 |