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数据库中保

寻求以下问题的解决方案

在我们的应用程序中,我们具有根据用户选择转换单位的功能。例如。根据用户选择的单位,将千克转换为磅,反之亦然

  • 我们有一个屏幕,用户可以选择提供数值的单位,例如Kg或lbs
  • 我们有一个表格,其中包含系统支持的预定义单位的所有公式,例如1Kg=2.20462lbs
  • 我们从数据库中获取公式,并根据用户提供的实际值计算/评估公式
  • 因为,用户可以根据自己的选择查看任何单元。我们决定将用户在屏幕上提供的值以标准单位保存在数据库中,以便于维护。在这种情况下,假设我们决定只在kg数据库中保存,但是,用户可能在屏幕上选择了“lbs”,但在保存时,我们会将“lbs”转换为“kg”,然后保存到数据库中
  • 在从数据库读取数据时,若用户希望在屏幕上看到“lbs”,我们会转换为“lbs”
  • 希望到目前为止实施得很清楚,现在对上述解决方案的问题是

  • 假设用户已选择值“1”作为“lbs”,并将其保存
  • 在数据库中,我们将以“kg”为单位保存,因此“1”的值在数据库中保存为2.20462
  • 再次阅读时,我们将转换为以“lbs”显示,现在我们得到的值为0.99998。这是由于公式的精确性
  • 但用户要求至少显示他输入的相同值,在本例中为“1”,但我们必须进行计算,将其转换回“lbs”,因为我们在数据库中保存的是“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