2016-11-15 3 views
0

Ищет решение проблемы.Точность определения единицы измерения конвертации

В нашем приложении у нас была функциональность преобразования единиц по выбору пользователя. например. Преобразуйте килограмм в фунты или наоборот на основе выбора единиц пользователем.

  1. У нас есть экран, на котором пользователи могут выбрать устройство, в котором он обеспечивает значение, например, кг или фунтов
  2. У нас есть таблица, которая содержит все формулы для предопределенного блока, наша система поддерживает, например 1Kg = 2.20462lbs так
  3. Мы извлекаем формулу из базы данных и вычисляем/оцениваем формулу с фактическими значениями, предоставленными пользователем.
  4. Поскольку пользователь имеет возможность видеть любые устройства по своему выбору. мы решили сохранить значение, которое пользователь предоставил на экране в стандартном блоке только в нашей базе данных, для упрощения обслуживания. в этом случае предположим, что мы решили сохранить только в базе данных с килограммами, однако пользователь может выбрать «lbs» на экране, но при сохранении мы переводим «lbs» в «кг», а затем мы будем сохранять в базе данных
  5. при чтении из базы данных мы преобразовать в «фунты», если пользователь намеревался увидеть в «фунтах» на экране

Надежда до сих пор implementaton ясно, теперь проблема выше решения является

  1. Давайте предположим, что пользователь выбрал значение '1' как 'lbs' и сохранил его
  2. В базе данных мы сэкономим в 'кг' поэтому значение «1» сохраняется как 2.20462 в базе данных
  3. при чтении мы снова будем делать преобразования, чтобы показать в «фунтах» теперь мы получаем значение как 0.999998. это ожидается из-за точности в формуле
  4. Но пользователь, попросив по крайней мере показать то же значение, что и он, в этом случае «1», но мы должны сделать расчет, чтобы преобразовать его обратно в «lbs», поскольку мы сохраняем 'кг' в базе данных

Я ищу решение этой проблемы, что может быть лучшим решением с минимальными изменениями.

Определение таблицы

Id | UnitConversion 
1 | 100 
2 | 200 
3 | 30 

Наше приложение разработано на Angularjs, WebAPI и SQL сервер

+0

Что такое определение столбца таблицы? Где происходит преобразование (Угловое, БД и т. Д.)? – wdosanjos

+0

Конверсия происходит на стороне клиента с помощью директивы Angularjs и сохраняет значение преобразования в базе данных в одном столбце без идентификатора единицы, поскольку мы сохраняем значение только в «Kg». Обновите определение таблицы в моем сообщении. Надеюсь, это поможет – Tatipaka

+0

Что такое определение UnitConversion (float, double, number)? – wdosanjos

ответ

0

На стороне сервера Sql выбрать более мелкий масштаб, то, что вам нужно, чтобы вернуться к клиенту. Например, если вам нужно 5 цифр справа от десятичной точки, установите масштаб 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; 

Примечание «Десятичные и числовые синонимы и могут быть использованы как взаимозаменяемые.» msdn.microsoft.com/en-us/library/ms187746.aspx

+0

было бы полезно отметить: «Десятичные и числовые являются синонимами и могут использоваться взаимозаменяемо». https://msdn.microsoft.com/en-us/library/ms187746.aspx, поэтому OP может просто удостовериться, что точность и масштаб числовых достаточно велики, без необходимости изменения до десятичной. – Matt

+1

@ Matt Done, спасибо. – Serg

1

Просто для удовольствия, вот урезанная версия моей утилиты преобразования. Просто покажите МАСС здесь. Сохраняя коэффициенты преобразования как 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([email protected],cast(MapValue as float),null))/Max(IIF([email protected],cast(MapValue as float),null)) 
From @Map 
Where MapName in(@From,@To) 

Возвращает

2.20462262184878