Java中存储金额用什么数据类型?
2017-12-27 00:00
323 查看
很早之前, 记得一次面试, 面试官问存储金钱用什么数据类型? 当时只知道8种数据类型(boolean, byte, short, int, long, float, double, char)的我, 回答了double, 因为我觉得double是双精度类型, 最适合, 但是面试官告诉我应该用BigDecimal! 最近在做支付的项目, 才对这种数据类型有了更多的了解.
示例1
问, 结果是多少? 0.01?
No! 结果是0.009999999999999998!
为什么会这样呢? 因为float和double都是浮点数, 都有取值范围, 都有精度范围. 浮点数与通常使用的小数不同, 使用中, 往往难以确定. 常见的问题是定义了一个浮点数, 经过一系列的计算, 它本来应该等于某个确定值, 但实际上并不是! 金额必须是完全精确的计算, 故不能使用double或者float, 而应该采用java.math.BigDecimal.
请看示例:
示例2
加减乘除使用了英文的加减乘除, 即add, substract, multiply和divide
示例3
两个BigDecimal值比较使用compareTo方法, 比较结果有-1, 0, 1, 分别表示小于, 等于, 大于; 对于0, 可以使用BigDecimal.ZERO表示!
示例4
其中setScale的第一个参数是小数位数, 这个示例是保留2位小数, 后面是四舍五入规则.
`balance` decimal(18,2) DEFAULT '0.00' COMMENT '账户余额',
栗子
请看题:示例1
问, 结果是多少? 0.01?
No! 结果是0.009999999999999998!
为什么会这样呢? 因为float和double都是浮点数, 都有取值范围, 都有精度范围. 浮点数与通常使用的小数不同, 使用中, 往往难以确定. 常见的问题是定义了一个浮点数, 经过一系列的计算, 它本来应该等于某个确定值, 但实际上并不是! 金额必须是完全精确的计算, 故不能使用double或者float, 而应该采用java.math.BigDecimal.
加减乘除
两个BigDecimal值应该怎样进行加减乘除呢? +, -, *, / 这样写吗? 不!请看示例:
示例2
加减乘除使用了英文的加减乘除, 即add, substract, multiply和divide
大小比较
两个BigDecimal值怎么比较大小呢? 能用>或者<吗? 也不可以!示例3
两个BigDecimal值比较使用compareTo方法, 比较结果有-1, 0, 1, 分别表示小于, 等于, 大于; 对于0, 可以使用BigDecimal.ZERO表示!
小数位数及四舍五入规则
在项目中, 涉及到税费的计算, 计算的结果可能是小数点后面十几位, 那么怎么进行结算呢? 这就需要四舍五入这种东东了.示例4
其中setScale的第一个参数是小数位数, 这个示例是保留2位小数, 后面是四舍五入规则.
mysql数据库设计
BigDecimal在进行入库时, 数据库选择decimal类型, 长度可以自定义, 如18; 小数点我们项目中用的是2, 保留2位小数. 此外还要注意的就是默认值, 一定写成0.00, 不要用默认的NULL, 否则在进行加减排序等操作时, 会带来转换的麻烦!`balance` decimal(18,2) DEFAULT '0.00' COMMENT '账户余额',
相关文章推荐
- Java中存储金额用什么数据类型
- Java中存储金额用什么数据类型?
- Java中存储金额用什么数据类型?
- Java中存储金额用什么数据类型?
- Java中存储金额用的数据类型:BigDecimal
- java中的各种数据类型在内存中存储的方式
- java中的各种数据类型在内存中存储的方式 二
- java中数据类型在内存中存储的方式
- java中的各种数据类型在内存中存储的方式
- Java中基本数据类型的取值范围及存储需求
- java中关于String 类型数据 的存储方式
- java中的各种数据类型在内存中存储的方式
- java中的各种数据类型在内存中存储的方式
- Mysql中的数据类型对应于Java中什么数据类型
- 问:java中常用数据类型的拆箱与装箱有什么坑
- java中的各种数据类型在内存中存储的方式
- java 数据存储到什么地方?
- java中的各种数据类型在内存中存储的方式
- java中的各种数据类型在内存中存储的方式
- JAVA中有关byte,int,long这些基本数据类型的存储方式以及负数在JAVA中的表示方式