我有一个表,其中的付款存储在一个类型的列中VARCHAR
这是来自该领域的示例数据:
10.01
55.11
最近,作为新请求的一部分,我们不得不从我们存储在VARCHAR列中的数字中删除小数点。
所以,我有这个:
CONVERT(BIGINT, CONVERT(REAL, RTRIM(LTRIM(@amt))) * 100) as PaymentAmount
转换为REAL(不能转换为BIGINTfrom VARCHAR),乘以 100 然后转换为BIGINT
现在的问题是,有时在转换过程中,最终结果会少 1 美分。
示例:'10.11'转换为1010,10.15到1014
简单的测试方法:
SELECT CONVERT(BIGINT, CONVERT(REAL, RTRIM(LTRIM(10.15))) * 100) as PaymentAmount
查询的结果是1014。
我通过将转换从REALtoFLOAT和删除转换为BIGINT.
另一种解决方法是CAST像这样使用:
CAST(@amt as float)*100 as PaymentAmount
我使用从10.00到10.99和在 100 个值范围内的数字进行转换,错误的数字是:
10.11转换为101010.15转换为101410.19转换为101810.23转换为1022
该范围内的所有其他值都很好。奇怪的是,11.11转换为1111.
所以问题是,到底为什么要这样做,模式是什么?从DataType MSDN REAL 不是一个精确的数字,但 FLOAT 也是如此,但 float 适用于整个范围。
编辑:我没有提到varchar大小为 1000。