数据库中在设计金钱的时候,是选择int类型好 还是decimail
我的业务场景是 金钱到小数点后2位 比如12.11
如果采用int 我的计算比较准确 只需要显示的时候把结果缩小2位即可 例如 300 就是3块钱、20 就是2毛钱
但是如果采用decimail 一个是传递参数麻烦 二个是有计算误差 三是性能问题
请有相关金钱计算设计的人,帮忙回答下,谢谢啦~~
decimal(10,2)
https://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=4_2
当年我玩冒险岛online的时候,仓库里最多只能放2147483647的钱。所以盛大用的应该是有符号整型=。=
decimal 比较合理一点
一般用decimal
压箱底的文章。为什么不用浮点数,而是使用 decimal
:
- 代码之谜(四)- 浮点数(从惊讶到思考)
- 代码之谜(五)- 浮点数(谁偷了你的精度?)
如果采用
int
我的计算比较准确
你的逻辑是不是这样:int
是定点数,比较准确。
但是 decimal
也是定点数,decimal
虽然是小数,但是不是浮点数,因此 decimal
和 int
的准确度是一样的。
只需要显示的时候把结果缩小 2 位即可,例如
300
就是3
块钱、20
就是2
毛钱。
缩小2位。怎么缩写?除以10?还是变成字符串,左移?
你不觉得麻烦吗?
但是如果采用
decimal
,一个是传递参数麻烦,二个是有计算误差,三是性能问题。
decimal
就是小数,定点小数。所以,传递参数肯定不麻烦。(不知道你使用什么语言?)decimal
在所有的表示范围内,都可以精确表示出来。不会像浮点数一样存在误差。比起你自己反复的乘以10,除以10,
decimal
的性能还是比你的高。
再次推荐我写的那2篇文章,破除对小数、定点数、浮点数的误解。
我记得还有个money
的数据类型。
@justjavac 已经解释的很好了
float占4个字节,double占8个字节,decimail(M,D)占M+2个字节
decimail精度更高,如果不是decimal,2个字段a为0.1,b为0.2 select a+b;会不等于0.3//js也这样。。。