【问题标题】:cast varchar to float to bigint将 varchar 转换为浮动到 bigint
【发布时间】:2013-03-21 01:35:47
【问题描述】:

我正在尝试将 varchar 转换为 bigint。然后将其插入 int 列。我发现我没有得到预期的价值。然后我尝试了以下语句:

DECLARE @varData VARCHAR(50)

SET @varData  = '0000019.33'

select cast(@varData *cast(100 as float) as bigint)

select cast(@varData *cast(100 as float) as varchar)

select cast(cast(@varData *cast(100 as float) as varchar) as float)

结果:

1932

1933

1933

我无法理解为什么会出现这种差异。但是当我将值更改为0000029.33 时,结果就没有区别了。

我被卡住了,不知道为什么会这样。需要帮助..!!!

【问题讨论】:

    标签: tsql casting varchar bigint


    【解决方案1】:

    请看Difference between numeric,float and decimal in sql server

    对于你的问题,你应该尝试 CAST @vardata as numeric,像这样

    SELECT CAST(CAST(@varData AS numeric(27,9)) * 100  AS bigint)
    

    【讨论】:

      【解决方案2】:

      这是因为 sql 对数据进行四舍五入,所以假设你选择了错误的整数而不是 2.97,你将得到 3。 现在试着想象一下如果你只想转换 0.000002 会丢失多少数据:) 希望你现在能更好地理解

      DECLARE @varData VARCHAR(50),
              @float float,
              @bigint bigint
      
      SET @varData  = '0000019.33'    
      set @bigint = convert ( bigint, (convert ( float, @vardata )) )
      print @bigint
      --or
      set @float= convert ( float, @vardata )
      set @bigint=convert ( bigint, @float)
      print @bigint
      

      【讨论】:

      • 我将值更改为“0000019.73”,我得到的是 1973,没有四舍五入。同样对于“0000029.33”,我得到所有查询的 2933。
      • 当你改变数字时数据不会丢失你甚至可以切换到 0000000000000000000029.29 当你转换变量时丢失发生例如声明@ck int set @ck=1.56 select cast(@ck as varchar )
      猜你喜欢
      • 2021-05-22
      • 2012-04-11
      • 2015-11-10
      • 1970-01-01
      • 1970-01-01
      • 2018-02-10
      • 2014-08-11
      • 2017-01-20
      • 1970-01-01
      相关资源
      最近更新 更多