SQL Server float 四舍五入陷阱

检查发票里的金额税额计算SQL的时候,发现金额、税额四舍五入为2位小数的结果,有的有进位,有的没有进位。

最后检查出其中一个计算变量是float类型,乘了以后再四舍五入必出异常。

重现如下:

变量数字大小不同,进位结果不同;定义变量为不同的float精度,进位结果不同。

 

解决办法:

将变量改为dec类型

输出结果:

ROUND dec 1000.0300000000 256.0300000000 255.0300000000 3.0300000000 0.0300000000

 

________________________________

原因:

在SQL Server中,实际上小数数值只有两种数据类型:float 和 decimal,分别是近似数值和精确数值。其他小数类型,都可以使用float和decimal来替代,例如,双精度(double precision)数据类型等价于 float(53),real等价于float(24),numeric是 decimal的同义词,应该避免在程序中直接使用 double precision、real和numeric,而是用 float(24) 、float(53)和decimal 代替。

float是近似数值,存在精度缺失;decimal是精确数值,不存在精度损失。当数值不允许精度丢失时,使用 decimal数据类型存储数据。在计算小数的除法时, Server 内部隐式升级数据类型,根据小数数值的数据类型,就近向float(24) 或float(53)转换。

发表评论

电子邮件地址不会被公开。 必填项已用*标注