Sql server 将字段转换为浮点,但除以整数会产生不正确的结果

Sql server 将字段转换为浮点,但除以整数会产生不正确的结果,sql-server,Sql Server,我在我们的土地管理软件中工作,该软件包括一个名为ESFT_BILLINGEDU的自定义字段,该字段用于合并数据库中的其他几个自定义字段,然后将总数除以20,以获得用于下水道计算的计费EDU(我为公共机构工作)。即使使用了可被20整除的整数,显示的答案也总是以.2关闭 我们的软件不支持使用十进制,因此我无法转换为十进制(这可能会解决问题)。我尝试过使用CONVERT to INTEGER,根本不使用CONVERT,而是简单地进行除法,并使用CAST和ROUND来查看是否可以得到正确的结果。所有这些

我在我们的土地管理软件中工作,该软件包括一个名为ESFT_BILLINGEDU的自定义字段,该字段用于合并数据库中的其他几个自定义字段,然后将总数除以20,以获得用于下水道计算的计费EDU(我为公共机构工作)。即使使用了可被20整除的整数,显示的答案也总是以.2关闭

我们的软件不支持使用十进制,因此我无法转换为十进制(这可能会解决问题)。我尝试过使用CONVERT to INTEGER,根本不使用CONVERT,而是简单地进行除法,并使用CAST和ROUND来查看是否可以得到正确的结果。所有这些都失败了

CONVERT([float],CONVERT([float](2),((((((((((((((((((((((((((isnull([EXT1_BAR_SINK],(0))*(2)+isnull([EXT1_BATHTUB],(0))*(4))+isnull([EXT1_CLWASH],(0))*(4))+isnull([EXT1_DEN_LAV],(0))*(1))+isnull([EXT1_DISHWASH],(0))*(4))+isnull([EXT1_FLOOR_DRN],(0))*(1))+isnull([EXT2_KIT_SINK],(0))*(4))+isnull([EXT2_LAUN_TUB],(0))*(4))+isnull([EXT2_LAVY_SNGL],(0))*(2))+isnull([EXT2_LAVY_DBL],(0))*(4))+isnull([EXT2_MOP_SINK],(0))*(4))+isnull([EXT2_SHOW],(0))*(4))+isnull([EXT2_URIN_WALL],(0))*(5))+isnull([EXT2_WATER_CLOSET],(0))*(6))+isnull([EXT2_WCL_FLUSH],(0))*(10))+isnull([ext1_cir_sink],(0))*(4))+isnull([ext1_cup_sink],(0))*(1))+isnull([ext1_den_unit],(0))*(1))+isnull([ext1_drink_foun],(0))*(1))+isnull([ext1_flushing],(0))*(10))+isnull([ext2_rv_dump],(0))*(20))+isnull([ext2_rv_spaces],(0))*(8))+isnull([ext2_urin_flsh],(0))*(3))+isnull([ext2_urin_step_on],(0))*(10))+isnull([ext2_wash_sink_set],(0))*(3))+isnull([EXT1_FLOOR_SINK],(0))*(4))+((((((((((((((((((((((((isnull([ENEW_SINK],(0))*(2)+isnull([ENEW_BATH],(0))*(4))+isnull([ENEW_CLTHWASH],(0))*(4))+isnull([ENEW_DEN_LAV],(0))*(1))+isnull([ENEW_DISHWASH],(0))*(4))+isnull([ENEW_FLR_DRN],(0))*(1))+isnull([ENEW2_KIT_SINK],(0))*(4))+isnull([ENEW2_LAUN_TUB],(0))*(4))+isnull([ENEW2_LAVY_SNGL],(0))*(2))+isnull([ENEW2_LAVY_DBL],(0))*(4))+isnull([ENEW2_MOP_SINK],(0))*(4))+isnull([ENEW2_SHOWER],(0))*(4))+isnull([ENEW2_URIN_Wall],(0))*(5))+isnull([ENEW2_WCL_Home],(0))*(6))+isnull([ENEW2_WCL_FLUSH],(0))*(10))+isnull([enew2_urin_flush],(0))*(3))+isnull([enew_cir_spray],(0))*(4))+isnull([enew_cup_sink],(0))*(1))+isnull([enew_den_unit],(0))*(1))+isnull([enew_drink_foun],(0))*(1))+isnull([enew_flushing],(0))*(10))+isnull([enew2_rv_dump],(0))*(20))+isnull([enew2_rv_space],(0))*(8))+isnull([enew2_urin_step],(0))*(10))+isnull([ENEW_FLR_SINK],(0))*(4)))+isnull([enew2_wash_sink],(0))*(3)))/CONVERT([float],(20),(0)),(0)),(0)))

[]中的字段是自定义屏幕字段。最后一行代码将这些总数除以20得到一个数字。我无法正确划分字段,它总是被关闭。例如,在我们的一个许可证中,现有装置的数量(代码的第一部分是230,新装置的数量)(代码的第二部分是223,总共453。这除以20,最后一行代码..等于22.65,当前代码给出的答案是22.4500007629395)

我制作了一个临时表来表示源值,然后删除了过早的转换,它就成功了。我相信SQL将值转换为合适的中间类型,并进行了正确的计算,因为我们没有强制使用“限制”导致舍入问题的数据类型。我在末尾添加了一个强制转换,以便前端代码可以读取浮点结果值

我插入到临时行中的值完全符合您的规范,即第一组值总计为230,最后一组值总计为223,结果为22.65。我删除了额外的括号,因为SQL在添加之前已经相乘了

create table #temp (
   [EXT1_BAR_SINK]             float null, 
   [EXT1_BATHTUB]              float null,
   [EXT1_CLWASH]               float null,
   [EXT1_DEN_LAV]              float null,
   [EXT1_DISHWASH]             float null,
   [EXT1_FLOOR_DRN]            float null,
   [EXT2_KIT_SINK]             float null,
   [EXT2_LAUN_TUB]             float null,
   [EXT2_LAVY_SNGL]            float null,
   [EXT2_LAVY_DBL]             float null,
   [EXT2_MOP_SINK]             float null,
   [EXT2_SHOW]                 float null,
   [EXT2_URIN_WALL]            float null,
   [EXT2_WATER_CLOSET]         float null,
   [EXT2_WCL_FLUSH]            float null,
   [ext1_cir_sink]             float null,
   [ext1_cup_sink]             float null,
   [ext1_den_unit]             float null,
   [ext1_drink_foun]           float null,
   [ext1_flushing]             float null,
   [ext2_rv_dump]              float null,
   [ext2_rv_spaces]            float null,
   [ext2_urin_flsh]            float null,
   [ext2_urin_step_on]         float null,
   [ext2_wash_sink_set]        float null,
   [EXT1_FLOOR_SINK]           float null,
   [ENEW_SINK]                 float null,
   [ENEW_BATH]                 float null,
   [ENEW_CLTHWASH]             float null,
   [ENEW_DEN_LAV]              float null,
   [ENEW_DISHWASH]             float null,
   [ENEW_FLR_DRN]              float null,
   [ENEW2_KIT_SINK]            float null,
   [ENEW2_LAUN_TUB]            float null,
   [ENEW2_LAVY_SNGL]           float null,
   [ENEW2_LAVY_DBL]            float null,
   [ENEW2_MOP_SINK]            float null,
   [ENEW2_SHOWER]              float null,
   [ENEW2_URIN_Wall]           float null,
   [ENEW2_WCL_Home]            float null,
   [ENEW2_WCL_FLUSH]           float null,
   [enew2_urin_flush]          float null,
   [enew_cir_spray]            float null,
   [enew_cup_sink]             float null,
   [enew_den_unit]             float null,
   [enew_drink_foun]           float null,
   [enew_flushing]             float null,
   [enew2_rv_dump]             float null,
   [enew2_rv_space]            float null,
   [enew2_urin_step]           float null,
   [ENEW_FLR_SINK]             float null,
   [enew2_wash_sink]           float null
) ;

insert into #temp (
[EXT1_BAR_SINK]      ,
[EXT1_BATHTUB]       ,
[EXT1_CLWASH]        ,
[EXT1_DEN_LAV]       ,
[EXT1_DISHWASH]      ,
[EXT1_FLOOR_DRN]     ,
[EXT2_KIT_SINK]      ,
[EXT2_LAUN_TUB]      ,
[EXT2_LAVY_SNGL]     ,
[EXT2_LAVY_DBL]      ,
[EXT2_MOP_SINK]      ,
[EXT2_SHOW]          ,
[EXT2_URIN_WALL]     ,
[EXT2_WATER_CLOSET]  ,
[EXT2_WCL_FLUSH]     ,
[ext1_cir_sink]      ,
[ext1_cup_sink]      ,
[ext1_den_unit]      ,
[ext1_drink_foun]    ,
[ext1_flushing]      ,
[ext2_rv_dump]       ,
[ext2_rv_spaces]     ,
[ext2_urin_flsh]     ,
[ext2_urin_step_on]  ,
[ext2_wash_sink_set] ,
[EXT1_FLOOR_SINK]    ,
[ENEW_SINK]          ,
[ENEW_BATH]          ,
[ENEW_CLTHWASH]      ,
[ENEW_DEN_LAV]       ,
[ENEW_DISHWASH]      ,
[ENEW_FLR_DRN]       ,
[ENEW2_KIT_SINK]     ,
[ENEW2_LAUN_TUB]     ,
[ENEW2_LAVY_SNGL]    ,
[ENEW2_LAVY_DBL]     ,
[ENEW2_MOP_SINK]     ,
[ENEW2_SHOWER]       ,
[ENEW2_URIN_Wall]    ,
[ENEW2_WCL_Home]     ,
[ENEW2_WCL_FLUSH]    ,
[enew2_urin_flush]   ,
[enew_cir_spray]     ,
[enew_cup_sink]      ,
[enew_den_unit]      ,
[enew_drink_foun]    ,
[enew_flushing]      ,
[enew2_rv_dump]      ,
[enew2_rv_space]     ,
[enew2_urin_step]    ,
[ENEW_FLR_SINK]      ,
[enew2_wash_sink]    
)
 values ( 
     1.0, 2.0, 1.0, 2.0, 3.0, 4.0, 3.0, 7.0, 1.0, 3.0
   , 3.0, 2.0, 1.0, 1.0, 2.0, 1.0, 5.0, 3.0, 2.0, 1.0
   , 1.0, 3.0, 3.0, 1.0, 2.0, 3.0, 1.0, 1.0, 2.0, 3.0
   , 1.0, 2.0, 2.0, 2.0, 1.0, 2.0, 3.0, 2.0, 1.0, 3.0
   , 3.0, 2.0, 1.0, 1.0, 1.0, 1.0, 2.0, 1.0, 2.0, 1.0
   , 1.0, 2.0
    ) ;

SELECT convert(float,
      (isnull([EXT1_BAR_SINK], 0)*(2)
      +isnull([EXT1_BATHTUB], 0)*(4)
      +isnull([EXT1_CLWASH], 0)*(4)
      +isnull([EXT1_DEN_LAV], 0)*(1)
      +isnull([EXT1_DISHWASH], 0)*(4)
      +isnull([EXT1_FLOOR_DRN], 0)*(1)
      +isnull([EXT2_KIT_SINK], 0)*(4)
      +isnull([EXT2_LAUN_TUB], 0)*(4)
      +isnull([EXT2_LAVY_SNGL], 0)*(2)
      +isnull([EXT2_LAVY_DBL], 0)*(4)
      +isnull([EXT2_MOP_SINK], 0)*(4)
      +isnull([EXT2_SHOW], 0)*(4)
      +isnull([EXT2_URIN_WALL], 0)*(5)
      +isnull([EXT2_WATER_CLOSET], 0)*(6)
      +isnull([EXT2_WCL_FLUSH], 0)*(10)
      +isnull([ext1_cir_sink], 0)*(4)
      +isnull([ext1_cup_sink], 0)*(1)
      +isnull([ext1_den_unit], 0)*(1)
      +isnull([ext1_drink_foun], 0)*(1)
      +isnull([ext1_flushing], 0)*(10)
      +isnull([ext2_rv_dump], 0)*(20)
      +isnull([ext2_rv_spaces], 0)*(8)
      +isnull([ext2_urin_flsh], 0)*(3)
      +isnull([ext2_urin_step_on], 0)*(10)
      +isnull([ext2_wash_sink_set], 0)*(3)
      +isnull([EXT1_FLOOR_SINK], 0)*(4)
      +isnull([ENEW_SINK], 0)*(2)
      +isnull([ENEW_BATH], 0)*(4)
      +isnull([ENEW_CLTHWASH], 0)*(4)
      +isnull([ENEW_DEN_LAV], 0)*(1)
      +isnull([ENEW_DISHWASH], 0)*(4)
      +isnull([ENEW_FLR_DRN], 0)*(1)
      +isnull([ENEW2_KIT_SINK], 0)*(4)
      +isnull([ENEW2_LAUN_TUB], 0)*(4)
      +isnull([ENEW2_LAVY_SNGL], 0)*(2)
      +isnull([ENEW2_LAVY_DBL], 0)*(4)
      +isnull([ENEW2_MOP_SINK], 0)*(4)
      +isnull([ENEW2_SHOWER], 0)*(4)
      +isnull([ENEW2_URIN_Wall], 0)*(5)
      +isnull([ENEW2_WCL_Home], 0)*(6)
      +isnull([ENEW2_WCL_FLUSH], 0)*(10)
      +isnull([enew2_urin_flush], 0)*(3)
      +isnull([enew_cir_spray], 0)*(4)
      +isnull([enew_cup_sink], 0)*(1)
      +isnull([enew_den_unit], 0)*(1)
      +isnull([enew_drink_foun], 0)*(1)
      +isnull([enew_flushing], 0)*(10)
      +isnull([enew2_rv_dump], 0)*(20)
      +isnull([enew2_rv_space], 0)*(8)
      +isnull([enew2_urin_step], 0)*(10)
      +isnull([ENEW_FLR_SINK], 0)*(4)
      +isnull([enew2_wash_sink], 0)*(3))
      / 20.0) as [ESFT_BILLINGEDU]
from #temp ;

drop table #temp ;
结果:

ESFT_BILLINGEDU 22.65 埃斯夫特·比林格杜 22.65
请正确格式化您的代码,使其可读。这是一个可怕的公式。我会诚实地指出这是一个浮点精度问题。由于您不能使用十进制,可能没有办法解决。您的软件可能不支持十进制,但您的数据库支持。将值存储在十进制中,并将其显示为整数。我无法想象这一点这很有帮助,但对于那些想要可读性的人,我通过一台漂亮的打印机运行了一个非常大的公式。它现在以另一种方式变得丑陋。floats/floats=疯狂的舍入问题。工作非常完美!非常感谢!修复了我们数据库中数百条执行不正确的记录!