精华内容
下载资源
问答
  • 我们开发的项目有可能会涉及到钱,那么钱应该用什么数据类型呢? 我们大多数人都会认为应该用double,那么是这样吗? 看下面的例子 为什么会这样呢? 因为float和double都是浮点数, 都有取值范围, 都有精度范围...

    我们开发的项目有可能会涉及到钱,那么钱应该用什么数据类型呢?

    我们大多数人都会认为应该用double,那么是这样吗?

    看下面的例子

    为什么会这样呢?

    因为float和double都是浮点数, 都有取值范围, 都有精度范围. 浮点数与通常使用的小数不同, 使用中, 往往难以确定。

    所以说,float和double都是不能用来表示精确的类型的;

    金额必须是完全精确的计算, 故不能使用double或者float, 而应该采用java.math.BigDecimal.

    decimal 小数

    金钱应该采用java.math.BigDecimal存储;

    MYSQL数据库选择decimal类型,注意默认值 一定写成0.00, 不要用默认的NULL, 否则在进行加减排序等操作时, 会带来转换的麻烦!

    下面是BigDecimal的加减乘除

    大小比较用方法compareTo,两个BigDecimal值比较使用compareTo方法,比较结果有-1、0、1,分别表示小于、等于和大于,

    对于0,可以使用BigDecimal.ZERO表示。

     

    展开全文
  • * 由于Java的简单类型不能够精确的对浮点数进行运算,这个工具类提供精 确的浮点数运算,包括加减乘除和四舍五入。 */ public class ArithUtil { // 默认除法运算精度 private static final int DEF_DIV_...
    import java.math.BigDecimal;
     
    /**
     * 由于Java的简单类型不能够精确的对浮点数进行运算,这个工具类提供精 确的浮点数运算,包括加减乘除和四舍五入。
     */
     
    public class ArithUtil
    {
     
        // 默认除法运算精度
        private static final int DEF_DIV_SCALE = 10;
     
        // 这个类不能实例化
        private ArithUtil()
        {
        }
     
        /**
         * 提供精确的加法运算。
         * 
         * @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();
        }
    }
    

     

    展开全文
  • Java中存储金额用什么数据类型

    千次阅读 2020-03-13 17:40:11
    在给自己做一个小的Java记账小程序的时候,对金额的处理时必不可少的,一开始选择的是float数据类型,在数据库中,存储金额的数据字段也是float类型。但是在实际操作的过程中,金额会出现失真的问题。 范例1: ...



    1. 抛砖引玉

    在给自己做一个小的Java记账小程序的时候,对金额的处理时必不可少的,一开始选择的是float数据类型,在数据库中,存储金额的数据字段也是float类型。但是在实际操作的过程中,金额会出现失真的问题。

    范例1:

    public static void main(String[] args){
        float num1 = 2015.35f;
        float num2 = 100.17f;
        float num3 = num1 - num2;
        System.out.println(num3);
    }
    

    结果是:1915.1799,而不是 1915.18,出现失真的问题。

    解决办法(X):想办法把数据四舍五入然后存到数据库

    出现问题:当多操作了几次后,直接到数据库检查金额是否正确的时候,失真问题依然存在,只不过存在于数据库而不是存在与程序。

    原因:float和double都是浮点数, 都有取值范围,都有精度范围。浮点数与通常使用的小数不同,使用中,往往难以确定。常见的问题是定义了一个浮点数,经过一系列的计算,它本来应该等于某个确定值,但实际上并不是,金额必须是完全精确的计算,故不能使用double或者float。

    解决办法:

    在程序中存储金额的数据类型用:java.math.BigDecimal,在数据库中存储金额的数据类型用:decimal
    长度可以自定义,如10,小数点在项目中用的是2,保留2位小数。

    此外还要注意的就是默认值,一定写成0.00,不要用默认的NULL,否则在进行加减排序等操作时,会带来转换的麻烦。

    SQL: 'amount' DECIMAL(10, 2) DEFAULT 0.00 NOT NULL COMMENT '金额',
    


    2. 加减乘除

    两个 BigDecimal 的值不能用 +、-、*、/ 来进行加减乘除

    范例2:

    public static void main(String[] args){
        BigDecimal x = new BigDecimal("1.3");
        BigDecimal y = new BigDecimal("2.5");
    	// 加法 --> 3.8
    	BigDecimal add = x.add(y);
    	System.out.println(add);
    	// 减法 --> -1.2
    	BigDecimal subtract = x.subtract(y);
    	System.out.println(subtract);
    	// 乘法 --> 3.25
    	BigDecimal multiply = x.multiply(y);
    	System.out.println(multiply);
    	// 除法 --> 0.5  ,RoundingMode.HALF_UP 四舍五入
    	BigDecimal divide = x.divide(y, RoundingMode.HALF_UP);
    	System.out.println(divide);
    }
    
    


    3. 大小比较

    两个BigDecimal值比较使用compareTo方法,比较结果有-1,0,1,分别表示小于, 等于, 大于

    对于0,使用BigDecimal.ZERO表示

    范例3:

    BigDecimal num = new BigDecimal("-3");
    if (num.compareTo(BigDecimal.ZERO) == -1) {
    	System.out.println("num 小于 0")} else if  (num.compareTo(BigDecimal.ZERO) == 1) {
    	System.out.println("num 大于 0")} else if  (num.compareTo(BigDecimal.ZERO) == 0) {
    	System.out.println("num 等于 0")}
    
    


    4. 小数位数及四舍五入规则

    setScale方法的第一个参数是小数位数,这个示例是保留2位小数,后面是四舍五入规则

    范例4:

    public static void main(String[] args){
        BigDecimal num = new BigDecimal("10.2621684798165165");
        System.out.println("原型 = " + num);
        System.out.println("直接删除多余的小数位 = " + num.setScale(2, BigDecimal.ROUND_DOWN));
        System.out.println("进位 = " + num.setScale(2, BigDecimal.ROUND_UP));
        System.out.println("四舍五入,碰到5位进位 = " + num.setScale(2, BigDecimal.ROUND_HALF_UP));
        System.out.println("四舍五入,碰到5位舍弃 = " + num.setScale(2, BigDecimal.ROUND_HALF_DOWN));
    }
    
    展开全文
  • 栗子 示例1 问, 结果是多少?...为什么会这样呢? 因为float和double都是浮点数, 都有取值范围, 都有精度范围. 浮点数与通常使用的小数不同, 使用中, 往往难以确定. 常见的问题是定义了一个浮点数, 经过一...

    可参考https://www.cnblogs.com/yadongliang/p/9066188.html

    栗子

    在这里插入图片描述
    示例1

    问, 结果是多少? 0.01?

    No! 结果是0.009999999999999998!

    为什么会这样呢? 因为float和double都是浮点数, 都有取值范围, 都有精度范围. 浮点数与通常使用的小数不同, 使用中, 往往难以确定. 常见的问题是定义了一个浮点数, 经过一系列的计算, 它本来应该等于某个确定值, 但实际上并不是! 金额必须是完全精确的计算, 故不能使用double或者float, 而应该采用java.math.BigDecimal.

    加减乘除

    两个BigDecimal值应该怎样进行加减乘除呢? +, -, *, / 这样写吗? 不!

    请看示例:
    在这里插入图片描述
    Java中存储金额用什么数据类型?

    示例2

    加减乘除使用了英文的加减乘除, 即add, substract, multiply和divide

    大小比较

    两个BigDecimal值怎么比较大小呢? 能用>或者<吗? 也不可以!
    在这里插入图片描述
    两个BigDecimal值比较使用compareTo方法, 比较结果有-1, 0, 1, 分别表示小于, 等于, 大于; 对于0, 可以使用BigDecimal.ZERO表示!

    小数位数及四舍五入规则

    在项目中, 涉及到税费的计算, 计算的结果可能是小数点后面十几位, 那么怎么进行结算呢? 这就需要四舍五入这种东东了
    在这里插入图片描述
    其中setScale的第一个参数是小数位数, 这个示例是保留2位小数, 后面是四舍五入规则.

    mysql数据库设计

    BigDecimal在进行入库时, 数据库选择decimal类型, 长度可以自定义, 如18; 小数点我们项目中用的是2, 保留2位小数. 此外还要注意的就是默认值, 一定写成0.00, 不要用默认的NULL, 否则在进行加减排序等操作时, 会带来转换的麻烦!

    `balance` decimal(18,2) DEFAULT '0.00' COMMENT '账户余额',
    
    展开全文
  • 先看个例子:  int i=4;...除数i是int类型3相除得到结果也是int类型。就是0.然后赋值给num.此时只是0被转成了double。。所以还是0.0 解决办法: int i=4; double num=3/(double)i; 输入结果就是0
  • 查看了对应的代码,发现在存储到数据库时,这个字段值的是Double类型,而在返回给前端时的是String类型,于是产生了疑问,String在接收小于1的小数时,为什么会丢失小数点前的0? 查阅了相关资料后,发现是...
  • java数据类型

    2017-09-11 10:19:00
    关于变量的使用这一块大体分为java的数据类型以及基本数据类型变量的定义及使用,以及变量的相互转换。 一:常量 什么是常量? 常量是在程序执行过程中其值不发生改变的。 java中常量的分类:字面值常量 自定义...
  • 小数常量 所有小数; 字符常量 单引号括起来的内容,里面只能放单个数字,单个字母或单个符号。注意单引号中什么也不放是不可以的,它代表不了任何字符。但是可以放一个空格字符,代表空格; 布尔常量 较为特殊...
  • 答:简单粗暴来讲,基本数据类型就是用来描述不同数据的一种定义方式和保存范围,在java中不同的数据不同的数据类型定义描述,java基本数据类型用于描述一些数字单元,比如:1或者1.1; 举例说明:比如描述一个人年龄...
  • Java 中 float 与 double 的区别 1.float是单精度浮点数,内存分配4个...2.java中默认声明的小数是double类型的,如double d=4.0 如果声明: float x = 4.0则会报错,需要如下写法:float x = 4.0f或者float x = (f...
  • mysql里记录货币用什么字段类型好?

    万次阅读 2018-03-06 16:42:45
    java的开发中,货币在数据库中MySQL常用Decimal和Numric类型表示,这两种类型被MySQL实现为同样的类型。他们被用于保存值,该值的准确精度是极其重要的值,例如与金钱有关的数据。当声明一个类是这些类型之一时,...
  • 常量 A:什么是常量? 常量就是在程序执行过程中其值不变的值。... 字符串常量,其值双引号括起来,例如 "java" 字符常量,其值单引号括起来,例如'a' 布尔常量,只有true和false 空常量...
  • 作为科班出身,又写了几年的Java,被一个老弟的一个问题难住了,问: 1/10.0的小数什么不能二进制完整表示? 思考了很久,发现自己已经把最基本的东西忘记了,这里回顾一下,最后再回答这个问题。 8种基础类型 ...
  • 什么关于钱要BigDecimal类型

    千次阅读 2019-06-11 16:49:28
    变成小数这种是编译不通过的,因为1.1默认是Double类型,所有这里必须在1.1后面添加f或者F; float a1 = 1.1F; float a2 = 1.2f; System.out.println(a2-a1);// double b1 = 1.1; double b2 = 1.2...
  • 02-Java基本数据类型

    2018-06-09 16:43:57
    * A:什么是常量  * 在程序执行的过程中其值不可以发生改变  * B:Java中常量的分类  * 字面值常量  * 自定义常量(面向对象部分讲)  * C:字面值常量的分类  * 字符串常量 双引号括起来的内容  * 整数常量 ...
  • Java数据类型进行简单的分类,图来表示: 在Java1.1中新增了两个数据类型,用于高精度计算的:BigInteger(支持任意精度整数)和BigDecimal(支持任意精度的小数)。 为什么需要数据分类:不同的数据类型...
  • Java语言基础(常量的概述和使用)(掌握) A:什么是常量 * 在程序执行的过程中其值不可以发生改变 * B:Java中常量的分类 * 字面值常量 * 自定义常量(面向对象部分讲) * C:字面值常量的分类 * 字符串常量 双...
  • Java学习 Day_02 1. 常量的概述和使用 什么是常量:在程序运行过程中值不发生改变的量 常量的分类: 字面值常量 自定义常量 字面值常量的分类: 字符串常量:双引号括起来,例如 “Hello World!...
  • PS:平常生活中,也会用到一些数据的类型,例如:数字、字符(文字)、是、非,且数字分为整数和小数,在Java中也是和生活中一样,有属于自己的数据类型Java种有八大基本数据类型和一些引用类型什么是字节?...
  • Java中存储金额用什么数据类型? 示例1 问, 结果是多少? 0.01? No! 结果是0.009999999999999998! 为什么会这样呢? 因为float和double都是浮点数, 都有取值范围, 都有精度范围. 浮点数与通常使用的小数不同, ...
  • 什么是运算符 运算符是一种特殊的符号,以表示数据的运算、赋值和比较等。 运算符的分类 算术运算符 赋值运算符 关系运算符 逻辑运算符 位运算符 三元运算符 算术运算符 注: (1)注意i++和++i的运算,前者先...
  • A:什么是常量 * 在程序执行的过程中其值不可以发生改变 * B:Java中常量的分类 * 字面值常量 * 自定义常量(面向对象部分讲) * C:字面值常量的分类 * 字符串常量 双引号括起来的内容 * 整数常量 所有整数 * ...
  • 编程的时候为什么变量呢?数学中,变量可以存储一个值,并且这个值可以参与运算。同样在编程中,会有各种各样的运算,产生各种各样的值,这些值就变量来存储。这些值是各种各样的,有数值,字符,布尔(逻辑...
  • 一、常量的概述和使用* 1:什么是常量 * 在程序执行的过程中其值不可以发生改变 * 2:Java中常量的分类 * 字面值常量 * 自定义常量 * 3:字面值常量的分类 * 字符串常量 双引号括起来的内容 * 整数常量 所有整数 * ...
  • 1.常量的概述和使用! 什么是常量 就是在程序的执行过程中其值不发生改变的量。 Java中常量的分类 ...(1): 字符串常量 双引号括起来的内容 “HelloWorld” ,“Hello” ...(3): 小数常量 所有小数 ...
  • 小数常量:所有小数; 字符常量:单括号引起来的内容; 布尔常量:较为特有,只有True和False 空常量:null 进制概述 什么是进制? 人们对定的一种进位方法。对任何一种进制——X进制就表示某一位置...
  • 数据类型是定义列中可以存储什么数据以及该数据实际怎么存储的基本规则。 在MySQL中有如下几种数据类型:数值类型MySQL的数值数据类型可以大致划分为两个类别,一个是整数,另一个是浮点数或小数。许多不同的子...
  • java的开发中,货币在数据库中MySQL常用Decimal和Numric类型表示,这两种类型被MySQL实现为同样的类型。他们被用于保存值,该值的准确精度是极其重要的值,例如与金钱有关的数据。当声明一个类是这些类型之一时,...

空空如也

空空如也

1 2 3 4 5 6
收藏数 119
精华内容 47
关键字:

java小数用什么类型

java 订阅