今天看到这么一道面试题:存储金钱用什么数据类型?
我的第一反应是很简单,使用float 或者double就可以了啊,而我们平常在练习或者在小公司的开发中也是这么用的。但是搜索了一下,发现这样是错误的做法,float、double数据类型在计算的时候会导致精度丢失,虽然其结果与真实值的误差可能是接近于0,但是在银行、财务相关的系统开发中,设计到的数据量很大,计算结果准确度要求极高的业务场景中,使用float、double必然会导致很大的误差和损失。
1. 正确做法:使用 BigDecimal
-
Java语言提供了另外一种数据类型 BigDecimal ,可以表示精确的浮点数,适合用作财务计算的数据类型。
-
但是需要注意的是,在使用BigDecimal的时候,BigDecimal有多个重载的构造方法能表示精度的值,只有用参数为String类型的构造方法才能表示。
举例:
用参数Double构造出来的BigDecimal运算值失去精度,应该是跟参数为Double有关的。
其实BigDecimal更像一个工具类,加减乘除的都有自己的函数,有兴趣的你可以自己再自己深入研究一下。
2. 加减乘除
3. 大小比较
4. 小数位数及四舍五入规则
在项目中,涉及到税费的计算,计算的结果可能是小数点后面十几位,那么怎么进行结算呢?这就需要四舍五入。
其中setScale的第一个参数是小数位数, 这个示例是保留2位小数, 后面是四舍五入规则。
5. mysql数据库设计
BigDecimal在进行入库时,数据库选择decimal类型, 长度可以自定义, 如18; 小数点我们项目中用的是2,保留2位小数。 此外还要注意的就是默认值, 一定写成0.00, 不要用默认的NULL,否则在进行加减排序等操作时,会带来转换的麻烦!
扫描二维码关注公众号,回复:
11115740 查看本文章
`balance` decimal(18,2) DEFAULT '0.00' COMMENT '账户余额'