ahmed_sa Ответов: 1

При обновлении данных по таблице temparts массовое значение изменилось после точки с плавающей запятой ?


Я работаю на SQL Server 2012. Когда я использую материал для сбора данных, разделенных запятой, я получаю

странные результаты. Массовое число, разделенное запятой в таблице #tmpParts

Не совсем то, что существует в исходной таблице #TempPC.

Подводя итог моей эмиссионной массе для части 5223986-2 для алюминия

is 580.28613 в таблице #TempPC
is 580.286 в таблице #tmpParts
Почему значения изменились для массы и как разделять запятую точно так же, как входные данные для значений массы #Temppc .

Также изменилось еще одно значение

CREATE TABLE #TempPc
(
    PartNumber nvarchar(50),
    Substance  nvarchar(100),
    Mass Float,
)

INSERT INTO #TempPc (PartNumber, Substance, Mass)
VALUES 
('5223986-2', 'Copper', 33.73757),
('5223986-2', 'Zinc', 12824.526),
('5223986-2', 'Aluminum', 580.28613),
('5223986-5', 'Copper', 33.73756),
('5223986-5', 'Zinc', 12824.52563),
('5223986-5', 'Aluminum', 580.28612)

CREATE TABLE #tmpParts
(
    id INT IDENTITY,
    PartNumber nvarchar(50),
    cnt INT,
    strSubstances NVARCHAR(MAX),
    strMass NVARCHAR(MAX)
)

INSERT INTO #tmpParts (PartNumber, cnt)
    SELECT  
        t.PartNumber, COUNT(t.Substance)
    FROM #TempPC t
    GROUP BY t.PartNumber


Но я получаю неправильный результат по массе, потому что он отображает данные двух частей одной и той же массы, разделенных запятой на две части .

Но в таблице #TempPC две части различаются по значению массы:

id  PartNumber  cnt strSubstances           strMass
1   5223986-2   3   Aluminum,Copper,Zinc    33.7376,580.286,12824.5
2   5223986-5   3   Aluminum,Copper,Zinc    33.7376,580.286,12824.5


Конечный результат мне нужны одинаковые числа на #TempPC с разделенными запятыми на таблице #tmpParts на strMass :

id  PartNumber  cnt strSubstances              strMass
1   5223986-2   3   Aluminum,Copper,Zinc    33.73757,580.28613,12824.526
2   5223986-5   3   Aluminum,Copper,Zinc    33.73756,580.28612,12824.52563


Что я уже пробовал:

UPDATE p
SET p.strSubstances = CAST (STUFF((SELECT ',' + CAST(t.Substance AS VARCHAR(3500))
                                   FROM #TempPC t
                                   WHERE t.PartNumber = p.PartNumber
                                   ORDER BY t.Substance
                                   FOR XML PATH('')), 1, 1, '') AS NVARCHAR(3500)),
    p.strMass = CAST (STUFF((SELECT ',' + CAST(t.Mass AS VARCHAR(3500))
                             FROM #TempPC t
                             WHERE t.PartNumber = p.PartNumber
                             ORDER BY t.Mass
                             FOR XML PATH('')), 1, 1, '') AS NVARCHAR(3500))
FROM #tmpParts p

1 Ответов

Рейтинг:
10

Daniel Pfeffer

В таблице #TempPc вы определяете массу как плыть Поплавок обычно имеет диапазон около 10-38 до 10 лет38, и точность около 6 цифр. Это означает, что такое значение, как 580.28613 будет округлено до 508.286.

Если вы используете двойной введите, ваше значение будет иметь точность около 16 цифр. Это, однако, не гарантирует, что десятичное значение будет записано точно. Один плыть или двойной обычно используется двоичная арифметика, поэтому десятичные дроби обязательно округляются. Это часто не имеет значения для научных или инженерных расчетов, но может иметь решающее значение, например, в финансовых расчетах.

Если требуется точная арифметика, используйте числовой или десятичный типы.