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