搜了下两者的区别,答案其实很明显:
numeric支持最长38位长度的数字,只有在你要的数字的长度超过38位时才推荐使用float
原因是,float在保存和提取,以及数学计算等方面,会产生于期待记过不一致的情况。
为什么呢?
因为float和real,保存的是一种近似值,而非准确值。比如,向float列中保存一个数,3.8,存完之后有可能变成3.7999999或者3.80000124
或者,存入2390.006529380733,变为2390.00652938073。少一位
但是float参与的浮点计算,确实有很大问题。
具体表现为,莫名其妙的自动保留不确定的有效小数位数。而且这种情况经常只在第一次计算时出现,时对时错。很不稳定
这个问题,我用numeric时也时有发生。所以现在比较困惑float到底该不该用。
而real参与的数学运算,问题最大,大多数情况结果都是错的:
0.165970772443(numeric)+0.1659708(real)=0.3319415
0.1659708(real)+0.165970772443(float)=0.331941544947806
总之,在float和real参与的计算和存取操作中,都会有莫名其妙的增减小数位的现象。
numeric虽然我也碰到过这种问题,但是几率相当小。
不喜欢用numeric的地方是,它会在小数位上保留无效的0,来占满设定的小数位数,而这点上,float会自动去除无效的0.看起来要清晰,转换成varchar时也不会看起来别扭。