首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >单位转换精度问题

单位转换精度问题
EN

Stack Overflow用户
提问于 2016-11-15 19:09:49
回答 2查看 494关注 0票数 1

寻求解决以下问题的方法。

在我们的应用程序中,我们有根据用户选择转换单元的功能。例如:根据用户的单元选择将kg转换为lbs,反之亦然。

  1. 我们有一个屏幕,用户可以在屏幕上选择他提供价值的单位,例如公斤或磅。
  2. 我们有一个表,其中包含我们系统支持的预定义单元的所有公式,例如1Kg = 2.20462lbs,类似于
  3. 我们从数据库中获取公式,并根据用户提供的实际值计算/计算公式。
  4. 因为,用户可以根据他/她的选择看到任何单位。为了便于维护,我们决定只在数据库中保存用户在屏幕上提供的值。在这种情况下,假设我们决定只在kg数据库中保存,但是,用户可能在屏幕上选择了'lbs‘,但是在保存时,我们会将'lbs’转换为'kg‘,然后将其保存到数据库中。
  5. 在从数据库读取时,如果用户想在屏幕上看到'lbs‘,我们就会转换为'lbs’。

希望到现在为止实施是明确的,现在对上述解决方案的问题是

  1. 让我们假设用户选择了值'1‘作为'lbs’,并保存它
  2. 在数据库中,我们将在'kg‘中保存'1’,以便将‘1’值保存为数据库中的2.20462
  3. 当我们再次阅读时,我们将转换为显示在'lbs‘中,现在我们得到了作为0.999998的值。这要归功于公式的精确性。
  4. 但是用户要求至少显示他输入的值,在本例中是'1‘,但是我们必须进行计算才能将其转换回'lbs’,因为我们正在数据库中保存'kg‘。

我正在寻求一个解决这个问题的办法

表定义

代码语言:javascript
复制
Id | UnitConversion
1  |   100
2  |   200
3  |   30 

我们的应用程序是在Angularjs、webapi和sql server上开发的。

EN

回答 2

Stack Overflow用户

发布于 2016-11-15 20:13:13

为了好玩,下面是我转换实用程序的简化版本。只是在这里展示弥撒而已。通过将转换因子存储为varchar,精度将达到单独的记录级别。

代码语言:javascript
复制
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)

返回

代码语言:javascript
复制
2.20462262184878
票数 1
EN

Stack Overflow用户

发布于 2016-11-15 19:40:47

在Sql服务器端,选择一个更细的比例,然后您需要返回到客户端。例如,如果需要小数点右侧的5位数字,请将DB列的标度设置为7。

代码语言:javascript
复制
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;

注:“十进制和数字是同义词,可以互换使用。”msdn.microsoft.com/en-us/library/ms187746.aspx

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40617829

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档