Access 2013查询中单精度(Single)字段四舍五入运算异常问题咨询
问题原因结论
Single类型就是本次舍入异常的根本原因,该问题属于二进制浮点数存储的固有特性,并非Access的Round函数存在逻辑缺陷。
具体原理说明
Single(单精度浮点数)是32位二进制存储格式,仅能提供约6~7位十进制有效数字的精度,且所有十进制小数都需要转换为二进制小数存储。绝大多数有限位十进制小数无法被二进制精确表示,比如你输入的95.88,在Single字段中实际存储的就是你查询到的95.879997253418近似值,界面展示的95.88只是Access默认做了展示层舍入的结果,和真实存储的数值并不一致。- 你调用
Round函数、或使用乘100000取整再除法的舍入方案时,所有运算都是基于实际存储的近似值执行,误差从运算第一步就已经存在,自然无法得到符合预期的结果,甚至会出现12~13位的异常小数尾差。 - 切换为
Double(双精度浮点数)后问题缓解的原因是,Double是64位二进制存储格式,可提供约15~17位十进制有效数字的精度,对于你仅需要5位有效精度的场景,近似误差已经小到不会影响到你要保留的小数位,因此运算结果符合预期。
优化建议
如果需要完全规避浮点精度误差,尤其是涉及金额类的精确运算场景,推荐将字段类型改为Currency(货币类型)或Decimal(小数类型),这两类是十进制存储格式,不会出现二进制浮点的转换误差,运算精度完全可控。
内容的提问来源于stack exchange,提问作者JWalter
相关产品推荐
相关产品推荐

