SQL数据库使用FLOAT字段来记录金额

作者:亂馬客  发布日期:2012-11-08 11:12:43

今天一早到公司,同事就反应数据库加密时,原本金额是1000039,解密出来却是1000040。

和同事看了一下,感觉好像是因为数据型态造成的呢?

于是发现数据库的字段居然是FLOAT。

问题解开了,因为数据型态是FLOAT,所以在CONVERT时,数据就有问题了(请看下面FLOAT_2_VARCHAR_VALUE的值)。

以下为FLOAT的CONVERT SQL,

 

SELECT CAST(1000039 AS FLOAT) AS FLOAT_VALUE
SELECT CAST(CAST(1000039 AS FLOAT) AS VARCHAR) AS FLOAT_2_VARCHAR_VALUE
SELECT CAST(CAST(CAST(1000039 AS FLOAT) AS VARCHAR) AS FLOAT) AS FLOAT_2_VARCHAR_2_FLOAT_VALUE

 


 

所以使用金额请使用精确数值的数据型态,如DECIMAL等。别再用近似数值的数据型态,如FLOAT、REAL。

以下为DECIMAL的CONVERT SQL,

 

SELECT CAST(1000039 AS DECIMAL) AS DECIMAL_VALUE
SELECT CAST(CAST(1000039 AS DECIMAL) AS VARCHAR) AS DECIMAL_2_VARCHAR_VALUE
SELECT CAST(CAST(CAST(1000039 AS DECIMAL) AS VARCHAR) AS DECIMAL) AS DECIMAL_2_VARCHAR_2DECIMAL_VALUE


 

如果存放显示只会到小数2位的话,建议使用money如搭果有超过小数2位以上的话,又配数据库加/解密去做convert成varchar的话, 那可以改使用decimal去指定小数字数,如下,
www.it165.net

--指定总位数为18,小数位数可放3位
DECLARE @defaultDECIMAL DECIMAL(18, 3);
SELECT @defaultDECIMAL = 1000039.123
SELECT @defaultDECIMAL
SELECT CAST(@defaultDECIMAL AS VARCHAR) AS DECIMAL_2_VARCHAR_VALUE
SELECT CAST(CAST(@defaultDECIMAL AS VARCHAR) AS DECIMAL(18, 3)) AS DECIMAL_2_VARCHAR_2_DECIMAL_VALUE

 


 

如果还是使用money的话,那在convert时,就改用STR函数去指定转换的小数字数,如下,

 

DECLARE @defaultMONEY MONEY;
SELECT @defaultMONEY = 1000039.1234
SELECT @defaultMONEY;
SELECT CAST(@defaultMONEY AS VARCHAR(53)) AS MONEY_2_VARCHAR_VALUE
SELECT CAST(CAST(@defaultMONEY AS VARCHAR) AS MONEY) AS MONEY_2_VARCHAR_2_MONEY_VALUE
SELECT LTRIM(STR(@defaultMONEY,18 , 4)) AS MONEY_2_STR_VALUE
SELECT CAST( LTRIM(STR(@defaultMONEY,18 , 4)) AS MONEY) AS MONEY_2_VARCHAR_2_MONEY_VALUE

 


 

 

Tag标签: SQL数据库   FLOAT字段  
  • 专题推荐

About IT165 - 广告服务 - 隐私声明 - 版权申明 - 免责条款 - 网站地图 - 网友投稿 - 联系方式
本站内容来自于互联网,仅供用于网络技术学习,学习中请遵循相关法律法规