Sql 单位换算精度问题
寻求以下问题的解决方案 在我们的应用程序中,我们具有根据用户选择转换单位的功能。例如。根据用户选择的单位,将千克转换为磅,反之亦然Sql 单位换算精度问题,sql,angularjs,sql-server,math,asp.net-web-api2,Sql,Angularjs,Sql Server,Math,Asp.net Web Api2,寻求以下问题的解决方案 在我们的应用程序中,我们具有根据用户选择转换单位的功能。例如。根据用户选择的单位,将千克转换为磅,反之亦然 我们有一个屏幕,用户可以选择提供数值的单位,例如Kg或lbs 我们有一个表格,其中包含系统支持的预定义单位的所有公式,例如1Kg=2.20462lbs 我们从数据库中获取公式,并根据用户提供的实际值计算/评估公式 因为,用户可以根据自己的选择查看任何单元。我们决定将用户在屏幕上提供的值以标准单位保存在数据库中,以便于维护。在这种情况下,假设我们决定只在kg数据库中保
Id | UnitConversion
1 | 100
2 | 200
3 | 30
我们的应用程序是在
sql server端的Angularjs、webapi和sql server选择了一个更精细的规模,然后您需要返回到客户端。例如,如果小数点右侧需要5位数字,请将DB列的比例设置为7
declare @n decimal(20,5) = 2.20462;
declare @t table (
m decimal(20,7)
);
insert @t(m) values
(1./@n),
(10./@n),
(1000./@n);
select cast(m*@n as decimal(20,5)) as r
from @t;
注意“十进制和数字是同义词,可以互换使用。”为了好玩,这里是我的转换工具的精简版本。只是在这里做弥撒。通过将转换因子存储为varchar,精度处于单个记录级别
Declare @Map table (MapType varchar(50),MapName varchar(50),MapValue varchar(50))
Insert Into @Map values
('Mass','tonnes (metric)','1000'),
('Mass','tons (US)' ,'907.18474'),
('Mass','tons (UK)' ,'1016.0469088'),
('Mass','stones' ,'6.35029318'),
('Mass','slugs(g-pounds)','14.593903'),
('Mass','Solar masses' ,'1.989e30'),
('Mass','pounds (troy)' ,'0.3732417216'),
('Mass','pounds' ,'0.45359237'),
('Mass','picograms' ,'1e-15'),
('Mass','ounces' ,'0.028349523'),
('Mass','ounces (troy)' ,'0.0311034768'),
('Mass','nanograms' ,'1e-12'),
('Mass','milligrams' ,'1e-6'),
('Mass','micrograms' ,'1e-9'),
('Mass','megatonnes' ,'1e9'),
('Mass','kilotonnes' ,'1e6'),
('Mass','kilograms' ,'1'), --- << Base
('Mass','hundredweights' ,'50.80234544'),
('Mass','hectograms' ,'0.1'),
('Mass','grams' ,'1e-3'),
('Mass','grains' ,'0.00006479891'),
('Mass','femtograms' ,'1e-18'),
('Mass','Earth masses' ,'5.980e24'),
('Mass','decagrams' ,'0.01'),
('Mass','cental' ,'45.359237'),
('Mass','carats (metric)','0.0002')
Declare @Value float = 1
Declare @From varchar(50)= 'kilograms'
Declare @To varchar(50)= 'pounds'
Select @Value * Max(IIF(MapName=@From,cast(MapValue as float),null)) / Max(IIF(MapName=@To,cast(MapValue as float),null))
From @Map
Where MapName in(@From,@To)
什么是表列定义?转换发生在何处(角度、DB等)?转换在客户端使用Angularjs指令进行,并将转换值以单列形式保存在数据库中,没有任何单位Id,因为我们仅将值保存在“Kg”中。在我的帖子中更新了表定义。希望这有助于
UnitConversion
definition(float,double,number)?它是sql Server中的数字。我建议您提高UnitConversion
列的精度,可能是float(53)
。并在UI上建立受支持的精度,以便正确地对值进行四舍五入。最好注意“十进制和数字是同义词,可以互换使用”。因此OP可以确保数字的精度和小数位数足够大,而无需更改为十进制。
2.20462262184878