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