Skip to content
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位小数。

参考:

Clone this wiki locally