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

    相关文章

    JDK21对虚拟线程的几种用法实践指南

    《JDK21对虚拟线程的几种用法实践指南》虚拟线程是Java中的一种轻量级线程,由JVM管理,特别适合于I/O密集型任务,:本文主要介绍JDK21对虚拟线程的几种用法,文中通过代码介绍的非常详细,... 目录一、参考官方文档二、什么是虚拟线程三、几种用法1、Thread.ofVirtual().start(

    JavaScript对象转数组的三种方法实现

    《JavaScript对象转数组的三种方法实现》本文介绍了在JavaScript中将对象转换为数组的三种实用方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友... 目录方法1:使用Object.keys()和Array.map()方法2:使用Object.entr

    Java8 Collectors.toMap() 的两种用法

    《Java8Collectors.toMap()的两种用法》Collectors.toMap():JDK8中提供,用于将Stream流转换为Map,本文给大家介绍Java8Collector... 目录一、简单介绍用法1:根据某一属性,对对象的实例或属性做映射用法2:根据某一属性,对对象集合进行去重二、Du

    Python中isinstance()函数原理解释及详细用法示例

    《Python中isinstance()函数原理解释及详细用法示例》isinstance()是Python内置的一个非常有用的函数,用于检查一个对象是否属于指定的类型或类型元组中的某一个类型,它是Py... 目录python中isinstance()函数原理解释及详细用法指南一、isinstance()函数

    Python中的sort方法、sorted函数与lambda表达式及用法详解

    《Python中的sort方法、sorted函数与lambda表达式及用法详解》文章对比了Python中list.sort()与sorted()函数的区别,指出sort()原地排序返回None,sor... 目录1. sort()方法1.1 sort()方法1.2 基本语法和参数A. reverse参数B.

    vue监听属性watch的用法及使用场景详解

    《vue监听属性watch的用法及使用场景详解》watch是vue中常用的监听器,它主要用于侦听数据的变化,在数据发生变化的时候执行一些操作,:本文主要介绍vue监听属性watch的用法及使用场景... 目录1. 监听属性 watch2. 常规用法3. 监听对象和route变化4. 使用场景附Watch 的

    Java Instrumentation从概念到基本用法详解

    《JavaInstrumentation从概念到基本用法详解》JavaInstrumentation是java.lang.instrument包提供的API,允许开发者在类被JVM加载时对其进行修改... 目录一、什么是 Java Instrumentation主要用途二、核心概念1. Java Agent

    使用MapStruct实现Java对象映射的示例代码

    《使用MapStruct实现Java对象映射的示例代码》本文主要介绍了使用MapStruct实现Java对象映射的示例代码,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,... 目录一、什么是 MapStruct?二、实战演练:三步集成 MapStruct第一步:添加 Mave

    Java 中 Optional 的用法及最佳实践

    《Java中Optional的用法及最佳实践》在Java开发中,空指针异常(NullPointerException)是开发者最常遇到的问题之一,本篇文章将详细讲解Optional的用法、常用方... 目录前言1. 什么是 Optional?主要特性:2. Optional 的基本用法2.1 创建 Opti

    Java中实现对象的拷贝案例讲解

    《Java中实现对象的拷贝案例讲解》Java对象拷贝分为浅拷贝(复制值及引用地址)和深拷贝(递归复制所有引用对象),常用方法包括Object.clone()、序列化及JSON转换,需处理循环引用问题,... 目录对象的拷贝简介浅拷贝和深拷贝浅拷贝深拷贝深拷贝和循环引用总结对象的拷贝简介对象的拷贝,把一个