BigDecimal对象的用法(及BigDecimal转换成double)

2024-06-22 09:38

本文主要是介绍BigDecimal对象的用法(及BigDecimal转换成double),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

这些是网上抄袭行为不是原创留下自用的未经测试不能尽信


1、JSP中BigDecimal转换成double

BigDecimal转换成double

在数据库中字段的类型为decimal(数字,数字),在JSP程序中要把它转换成double型的方法是: ((java.math.BigDecimal)row.get("数据库中字段")).doubleValue()


注:row是Map的对象。row.get("数据库中字段")得到的类型是Object,要先转换成与数据库类型相对应的decimal后,再转换成double.


2、BigDecimal用法详解


在我现在进行的项目中用到这种类型,用它来表示金额。可这种类型非常精确,当你在数据库里插入一条数据是6.00时,在显示时却是6.000000000000000000000。在页面显示非常不美观。在网上找了找,还真的找到了解决办法拿来和大家分享一下,在以后做系统时可以用到。它不仅可以做到double和float,而且在商业计算上也能显示它的作用。

java.math.BigDecimal。BigDecimal一共有4个够造方法,让我先来看看其中的两种用法:

  • 第一种:BigDecimal(double val)
    Translates a double into a BigDecimal.

  • 第二种:BigDecimal(String val)
    Translates the String repre sentation of a BigDecimal into a BigDecimal.

  • 使用BigDecimal要用String来够造,要做一个加法运算,需要先将两个浮点数转为String,然后够造成BigDecimal,在其中一个上调用add方法,传入另一个作为参数,然后把运算的结果(BigDecimal)再转换为浮点数。

    public static double add(double v1,double v2)
    public static double sub(double v1,double v2)
    public static double mul(double v1,double v2)
    public static double div(double v1,double v2)
    public static double div(double v1,double v2,int scale)
    public static double round(double v,int scale)
    附录
    源文件Arith.java:
    import java.math.BigDecimal;
    /**
    * 由于Java的简单类型不能够精确的对浮点数进行运算,这个工具类提供精
    * 确的浮点数运算,包括加减乘除和四舍五入。
    */
    public class Arith{ //默认除法运算精度
    private static final int DEF_DIV_SCALE = 10; //这个类不能实例化
    private Arith(){
    }
    /**
    * 提供精确的加法运算。
    * @param v1 被加数
    * @param v2 加数
    * @return 两个参数的和
    */
    public static double add(double v1,double v2){
    BigDecimal b1 = new BigDecimal(Double.toString(v1));
    BigDecimal b2 = new BigDecimal(Double.toString(v2));
    return b1.add(b2).doubleValue();
    }
    /**
    * 提供精确的减法运算。
    * @param v1 被减数
    * @param v2 减数
    * @return 两个参数的差
    */
    public static double sub(double v1,double v2){
    BigDecimal b1 = new BigDecimal(Double.toString(v1));
    BigDecimal b2 = new BigDecimal(Double.toString(v2));
    return b1.subtract(b2).doubleValue();
    }
    /**
    * 提供精确的乘法运算。
    * @param v1 被乘数
    * @param v2 乘数
    * @return 两个参数的积
    */
    public static double mul(double v1,double v2){
    BigDecimal b1 = new BigDecimal(Double.toString(v1));
    BigDecimal b2 = new BigDecimal(Double.toString(v2));
    return b1.multiply(b2).doubleValue();
    }
    /**
    * 提供(相对)精确的除法运算,当发生除不尽的情况时,精确到
    * 小数点以后10位,以后的数字四舍五入。
    * @param v1 被除数
    * @param v2 除数
    * @return 两个参数的商
    */
    public static double div(double v1,double v2){
    return div(v1,v2,DEF_DIV_SCALE);
    }
    /**
    * 提供(相对)精确的除法运算。当发生除不尽的情况时,由scale参数指
    * 定精度,以后的数字四舍五入。
    * @param v1 被除数
    * @param v2 除数
    * @param scale 表示表示需要精确到小数点以后几位。
    * @return 两个参数的商
    */
    public static double div(double v1,double v2,int scale){
    if(scale<0){
    throw new IllegalArgumentException(
    "The scale must be a positive integer or zero");
    }
    BigDecimal b1 = new BigDecimal(Double.toString(v1));
    BigDecimal b2 = new BigDecimal(Double.toString(v2));
    return b1.divide(b2,scale,BigDecimal.ROUND_HALF_UP).doubleValue();
    }
    /**
    * 提供精确的小数位四舍五入处理。
    * @param v 需要四舍五入的数字
    * @param scale 小数点后保留几位
    * @return 四舍五入后的结果
    */
    public static double round(double v,int scale){
    if(scale<0){
    throw new IllegalArgumentException("The scale must be a positive integer or zero");
    }
    BigDecimal b = new BigDecimal(Double.toString(v));
    BigDecimal one = new BigDecimal("1");
    return b.divide(one,scale,BigDecimal.ROUND_HALF_UP).doubleValue();
    }
    };


    3、注意double不能强制转BigDecimal

    public class Test {public static void main(String args[]) {double b_OLD = 4.1625;java.math.BigDecimal bd1 = new java.math.BigDecimal( b_OLD );System.out.println("BEFORE ROUNDING: " + bd1);}
    }可以用double类型初始化BigDecimal类。
    追问
    那为什么double  b = 4.44;java.math.BigDecimal  big = (java.math.BigDecimal )b;
    这样不能转换呢? 有什么区别吗?
    回答
    因为double是基本数据类型,不可以强制类型转换的。强制类型转换是针对Object的。Double b = 4.44; 这样也是不行的,因为BigDecimal没有从Double继承,所以没有办法强制类型转换。

    这篇关于BigDecimal对象的用法(及BigDecimal转换成double)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



    http://www.chinasem.cn/article/1083922

    相关文章

    Java中 instanceof 的用法详细介绍

    《Java中instanceof的用法详细介绍》在Java中,instanceof是一个二元运算符(类型比较操作符),用于检查一个对象是否是某个特定类、接口的实例,或者是否是其子类的实例,这篇文章... 目录引言基本语法基本作用1. 检查对象是否是指定类的实例2. 检查对象是否是子类的实例3. 检查对象是否

    Java中的内部类和常用类用法解读

    《Java中的内部类和常用类用法解读》:本文主要介绍Java中的内部类和常用类用法,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录内部类和常用类内部类成员内部类静态内部类局部内部类匿名内部类常用类Object类包装类String类StringBuffer和Stri

    C++类和对象之初始化列表的使用方式

    《C++类和对象之初始化列表的使用方式》:本文主要介绍C++类和对象之初始化列表的使用方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录C++初始化列表详解:性能优化与正确实践什么是初始化列表?初始化列表的三大核心作用1. 性能优化:避免不必要的赋值操作2. 强

    Python 异步编程 asyncio简介及基本用法

    《Python异步编程asyncio简介及基本用法》asyncio是Python的一个库,用于编写并发代码,使用协程、任务和Futures来处理I/O密集型和高延迟操作,本文给大家介绍Python... 目录1、asyncio是什么IO密集型任务特征2、怎么用1、基本用法2、关键字 async1、async

    SpringBoot3.4配置校验新特性的用法详解

    《SpringBoot3.4配置校验新特性的用法详解》SpringBoot3.4对配置校验支持进行了全面升级,这篇文章为大家详细介绍了一下它们的具体使用,文中的示例代码讲解详细,感兴趣的小伙伴可以参考... 目录基本用法示例定义配置类配置 application.yml注入使用嵌套对象与集合元素深度校验开发

    SpringBoot UserAgentUtils获取用户浏览器的用法

    《SpringBootUserAgentUtils获取用户浏览器的用法》UserAgentUtils是于处理用户代理(User-Agent)字符串的工具类,一般用于解析和处理浏览器、操作系统以及设备... 目录介绍效果图依赖封装客户端工具封装IP工具实体类获取设备信息入库介绍UserAgentUtils

    Java对象转换的实现方式汇总

    《Java对象转换的实现方式汇总》:本文主要介绍Java对象转换的多种实现方式,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录Java对象转换的多种实现方式1. 手动映射(Manual Mapping)2. Builder模式3. 工具类辅助映

    Java中的@SneakyThrows注解用法详解

    《Java中的@SneakyThrows注解用法详解》:本文主要介绍Java中的@SneakyThrows注解用法的相关资料,Lombok的@SneakyThrows注解简化了Java方法中的异常... 目录前言一、@SneakyThrows 简介1.1 什么是 Lombok?二、@SneakyThrows

    Python中的getopt模块用法小结

    《Python中的getopt模块用法小结》getopt.getopt()函数是Python中用于解析命令行参数的标准库函数,该函数可以从命令行中提取选项和参数,并对它们进行处理,本文详细介绍了Pyt... 目录getopt模块介绍getopt.getopt函数的介绍getopt模块的常用用法getopt模

    mysql中的group by高级用法

    《mysql中的groupby高级用法》MySQL中的GROUPBY是数据聚合分析的核心功能,主要用于将结果集按指定列分组,并结合聚合函数进行统计计算,下面给大家介绍mysql中的groupby用法... 目录一、基本语法与核心功能二、基础用法示例1. 单列分组统计2. 多列组合分组3. 与WHERE结合使