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

    相关文章

    webm怎么转换成mp4?这几种方法超多人在用!

    webm怎么转换成mp4?WebM作为一种新兴的视频编码格式,近年来逐渐进入大众视野,其背后承载着诸多优势,但同时也伴随着不容忽视的局限性,首要挑战在于其兼容性边界,尽管WebM已广泛适应于众多网站与软件平台,但在特定应用环境或老旧设备上,其兼容难题依旧凸显,为用户体验带来不便,再者,WebM格式的非普适性也体现在编辑流程上,由于它并非行业内的通用标准,编辑过程中可能会遭遇格式不兼容的障碍,导致操

    多重背包转换成0-1背包

    http://acm.hdu.edu.cn/showproblem.php?pid=2191 多重背包特点: 一种物品有C个(既不是固定的1个,也不是无数个) 优化的方法: 运用神奇的二进制,进行物品拆分,转化成01背包 物品拆分,把13个相同的物品分成4组(1,2,4,6) 用这4组可以组成任意一个1~13之间的数! 原理:一个数总可以用2^

    bytes.split的用法和注意事项

    当然,我很乐意详细介绍 bytes.Split 的用法和注意事项。这个函数是 Go 标准库中 bytes 包的一个重要组成部分,用于分割字节切片。 基本用法 bytes.Split 的函数签名如下: func Split(s, sep []byte) [][]byte s 是要分割的字节切片sep 是用作分隔符的字节切片返回值是一个二维字节切片,包含分割后的结果 基本使用示例: pa

    Java第二阶段---09类和对象---第三节 构造方法

    第三节 构造方法 1.概念 构造方法是一种特殊的方法,主要用于创建对象以及完成对象的属性初始化操作。构造方法不能被对象调用。 2.语法 //[]中内容可有可无 访问修饰符 类名([参数列表]){ } 3.示例 public class Car {     //车特征(属性)     public String name;//车名   可以直接拿来用 说明它有初始值     pu

    Prompt - 将图片的表格转换成Markdown

    Prompt - 将图片的表格转换成Markdown 0. 引言1. 提示词2. 原始版本 0. 引言 最近尝试将图片中的表格转换成Markdown格式,需要不断条件和优化提示词。记录一下调整好的提示词,以后在继续优化迭代。 1. 提示词 英文版本: You are an AI assistant tasked with extracting the content of

    C# double[] 和Matlab数组MWArray[]转换

    C# double[] 转换成MWArray[], 直接赋值就行             MWNumericArray[] ma = new MWNumericArray[4];             double[] dT = new double[] { 0 };             double[] dT1 = new double[] { 0,2 };

    UVM:callback机制的意义和用法

    1. 作用         Callback机制在UVM验证平台,最大用处就是为了提高验证平台的可重用性。在不创建复杂的OOP层次结构前提下,针对组件中的某些行为,在其之前后之后,内置一些函数,增加或者修改UVM组件的操作,增加新的功能,从而实现一个环境多个用例。此外还可以通过Callback机制构建异常的测试用例。 2. 使用步骤         (1)在UVM组件中内嵌callback函

    这些ES6用法你都会吗?

    一 关于取值 取值在程序中非常常见,比如从对象obj中取值 const obj = {a:1b:2c:3d:4} 吐槽: const a = obj.a;const b = obj.b;const c = obj.c;//或者const f = obj.a + obj.b;const g = obj.c + obj.d; 改进:用ES6解构赋值

    HTML5自定义属性对象Dataset

    原文转自HTML5自定义属性对象Dataset简介 一、html5 自定义属性介绍 之前翻译的“你必须知道的28个HTML5特征、窍门和技术”一文中对于HTML5中自定义合法属性data-已经做过些介绍,就是在HTML5中我们可以使用data-前缀设置我们需要的自定义属性,来进行一些数据的存放,例如我们要在一个文字按钮上存放相对应的id: <a href="javascript:" d

    PHP7扩展开发之对象方式使用lib库

    前言 上一篇文章,我们使用的是函数方式调用lib库。这篇文章我们将使用对象的方式调用lib库。调用代码如下: <?php $hello = new hello(); $result = $hello->get(); var_dump($result); ?> 我们将在扩展中实现hello类。hello类中将依赖lib库。 代码 基础代码 这个扩展,我们将在say扩展上增加相关代码。sa