转自:https://www.cnblogs.com/heqiyoujing/p/11221497.html
Java面试高频问题:你会用什么数据类型来存储金额?
如果这个时候你回答float,double那么恭喜你,又可以省出时间来准备别的公司的面试了,当面试官说float,和double不行的时候你可能还一脸懵逼,为啥不行?那么请看下面的例子:
public class Test {
public static void main(String[] args) {
double a=1;
double b=0.9;
double c=a-b;
System.out.println(c);
}
}
结果要多少,如果你觉得要0.1,那你就错了。结果居然要0.09999999999999998。因为float与double都是浮点数,浮点数参与的运算通常伴随着因为无法精确表示而进行的近似或舍入,所以导致结果会有丝毫的偏差,而涉及金额的计算是绝对不予许存在偏差的。
我们可以使用java.math.BigDecimal.来表示金额。
转自:https://www.cnblogs.com/yadongliang/p/9066188.html
java.math.BigDecimal 音译:碧哥 戴死猫
01 | 加减乘除
两个BigDecimal值应该怎样进行加减乘除呢? +, -, *, / 这样写吗? 不!
请看示例:
示例2
加减乘除使用了英文的加减乘除, 即add, substract, multiply和divide
02 | 大小比较
两个BigDecimal值怎么比较大小呢? 能用>或者<吗? 也不可以!
示例3
两个BigDecimal值比较使用compareTo方法, 比较结果有-1, 0, 1, 分别表示小于, 等于, 大于; 对于0, 可以使用BigDecimal.ZERO表示!
03 | 小数位数及四舍五入规则
在项目中, 涉及到税费的计算, 计算的结果可能是小数点后面十几位, 那么怎么进行结算呢? 这就需要四舍五入这种东东了.
示例4
其中setScale的第一个参数是小数位数, 这个示例是保留2位小数, 后面是四舍五入规则.
04 | mysql数据库设计
BigDecimal在进行入库时, 数据库选择decimal类型, 长度可以自定义, 如18; 小数点我们项目中用的是2, 保留2位小数. 此外还要注意的就是默认值, 一定写成0.00, 不要用默认的NULL, 否则在进行加减排序等操作时, 会带来转换的麻烦!
`balance` decimal(18,2) DEFAULT '0.00' COMMENT '账户余额',