zoukankan      html  css  js  c++  java
  • JavaSE-30 BigDecimal类的使用

    问题

    Java(其他编程语言也存在类似问题)中浮点数直接进行算术运算会导致精度丢失。

    示例代码:

    System.out.println("1.0 - 0.9 =" + (1.0 - 0.9));
    System.out.println("0.1 + 0.02 =" + (0.1 + 0.02));
    System.out.println("1.013 * 100 =" + (1.013 * 100));
    System.out.println("123.3 / 100 =" + (123.3 / 100));

     运行结果为:

     

    解决方案

    Java提供了BigDecimal类用来解决浮点数的运算。

    BigDecimal提供了大量的构造方法用于生成一个BigDecimal对象,包括把基本类型、数字字符串、数字数组构造成BigDecimal对象。

    这里以double类型数字转换为BigDecimal对象进行说明。常用有三种方式将double类型数字转换为BigDecimal对象。

    1. BigDecimal(double value):不推荐使用。生成的数值和value是一个近似数,不精确。
    2. BigDecimal(String value):推荐使用。
    3. BigDecimal.valueOf(double value):推荐使用。可以直接把一个double类型数值转换为精确的BigDecimal对象。

    BigDecimal类型提供了相应方法实现算术运算,常用方法如下表所示,具体参数可以查询API文档。

    方法 方法说明
    add() 相加
    subtract() 相减
    multiply() 相乘
    devide() 相除
    pow() 幂运算

    示例代码:

    BigDecimal num1 = new BigDecimal("0.05");
    BigDecimal num2 = new BigDecimal("0.01");
    System.out.println("0.05 + 0.01 =" + (num1.add(num2)));
    System.out.println("0.05 - 0.01 =" + (num1.subtract(num2)));
    System.out.println("0.05 * 0.01 =" + (num1.multiply(num2)));
    System.out.println("0.05 / 0.01 =" + (num1.divide(num2)));
    

      

    运行结果:

    自定义浮点数计算类

    项目中如果要频繁进行浮点数计算,可以自定义一个浮点数计算类。

    在进行除法运算过程中,如果需要进行精度控制,可以使用divide(BigDecimal divisor, int scale, int roundingMode)方法进行精度控制。sacale表示精度,roundingMode表示舍入方式。

    示例代码:

    public class MyArith {
    	/** 定义除法运算精度 */
    	private static final int DEFAULT_DIV_SCALE = 10;
    
    	/** 单例模式 */
    	private MyArith() {
    	}
    
    	/** 精确加法运算 */
    	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();
    	}
    
    	/** 精确除法运算 */
    	public static double div(double value1, double value2) {
    		BigDecimal b1 = BigDecimal.valueOf(value1);
    		BigDecimal b2 = BigDecimal.valueOf(value2);
    		// 精确到小数点后10位,四舍五入
    		return b1.divide(b2, DEFAULT_DIV_SCALE, BigDecimal.ROUND_HALF_UP).doubleValue();
    	}
    
    	/** 测试方法 */
    	public static void main(String[] args) {
    		System.out.println("0.05 + 0.01 = " + MyArith.add(0.05, 0.01));
    		System.out.println("1.0 + 0.42 = " + MyArith.sub(1.0, 0.42));
    		System.out.println("4.015 * 100 = " + MyArith.mul(4.015, 100));
    		System.out.println("123.3 / 99 = " + MyArith.div(123.3, 99));
    
    	}
    }
    

      

    运行结果:



    本博客文章未经许可,禁止转载和商业用途!

    如有疑问,请联系: 2083967667@qq.com


  • 相关阅读:
    XSS跨站脚本攻击实例讲解,新浪微博XSS漏洞过程分析
    PHP常量PHP_SAPI与函数php_sapi_name()简介,PHP运行环境检测
    PHP导出数据到CSV文件函数/方法
    iOS8 Core Image In Swift:视频实时滤镜
    实战:mysql版本号升级
    Apache Shiro 使用手冊 链接文件夹整理
    Windows 驱动开发
    Python标准库:内置函数bytearray([source[, encoding[, errors]]])
    cocos2d-x 2.2.3 之菜单分析(1)
    JSP具体篇——out
  • 原文地址:https://www.cnblogs.com/rask/p/8471576.html
Copyright © 2011-2022 走看看