读源码学MYSQL系列(一)decimal类型用法及存储实现

本文介绍了MYSQL中decimal类型的用法和存储实现,对比了float/double的精度问题。decimal能实现高精度计算,存储时通过4字节存储9位数位,整数和小数部分分开存储,并优化了负数的存储方式。通过源码分析,揭示了MYSQL如何进行高精度计算。
摘要由CSDN通过智能技术生成

问题来源

  最近在项目中用到了许多浮点数,精度要求较高,小数点后有4位甚至8位的,思考了一下,类似需求在工程计算、数值计算、股票金融、数字货币等场景都会出现。
  计算机提供了float/double两种浮点类型的数据来进行科学计算,但计算机中的浮点数据表示是有误差的,它们并不能准确的表示十进制的小数,在进行高精度计算时会产生误差,再经过复杂的传播,误差就变得很不可控了。
  为了保证结果的准确性,必须使用高精度计算。高精度计算的基本原理是模拟人工计算过程,保留计算过程中的所有数位,从而达到结果的精确性。各类语言及数据库都提供了对基本浮点类型的支持,扩展库都会提供相应的高精度数据的支持,在MYSQL中,decimal就是高精度浮点数据类型。后文主要介绍decimal的使用和实现原理。

MYSQL中浮点数据介绍

float/double

  MYSQL当中的float/double和我们常见的编程语言当中的float/double是一样的,分别表示32位单精度和64位双精度浮点数,在存储上分别需要4字节和8字节。从浮点的特性考虑,float和double都只能近似表示,无法精确。如下图所示,a列为float(10, 4),b列为double,参考第2行,同一个数131072.32保存在a和b的结果是不同的。在超出了浮点数的表示精度后,会有一定的截断,从而引起计算结果的误差。
在这里插入图片描述

  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值