-
Notifications
You must be signed in to change notification settings - Fork 0
Home
Zhou Minghong edited this page Apr 3, 2019
·
9 revisions
sql decimal允许用户自定义digits位数。(mysql 源码注释中包含了sql标准对decimal的描述)
使用long long作为decimal数据类型的底层表示。另外还需要一个额外存储记录scale(取值0-18)
long long 拥有8个byte,可以表示-99999...999 ~ 999...999 (18个9).
因此decimal的加减乘除都可转化为long long的计算。
- 加减法:
- 对齐小数点,即将scale小的decimal对应的longlong乘以10^(scale1-scale2)
- 对齐的两个longlong相加,同时返回结果对应的scale
- 乘法:
- 两个longlong相乘
- 由相乘两数的scale计算记过的scale
- 除法:
- 结果scale取除数和被除数的scale与6的最大值。参考sql server实现,最少保留6位小数。
参考:
-
mysql:https://github.com/mysql/mysql-server/blob/8.0/strings/decimal.cc
4bytes 表示 9个digits
-
postgres:https://doxygen.postgresql.org/backend_2utils_2adt_2numeric_8c_source.html
2 bytes 表示 4个digits
-
mapd: https://www.omnisci.com/docs/latest/5_datatypes.html
8个bytes表示18个digits,最多18位
-
sql server: https://docs.microsoft.com/en-us/previous-versions/sql/sql-server-2005/ms190476(v=sql.90)
precision <= 38