Относительно первого вопроса, числа десятичных знаков, нет ничего плохого. Это основное, каждодневное умножение, которое мы изучаем в школе: умножение двух десятичных чисел дает число с таким количеством десятичных цифр, как сумма десятичных цифр операндов. Число целых цифр может быть до суммы целых цифр операндов.
Умножение 10.11
на 12.13
122.6343
. Было бы очень неудобно, если бы SQL Server нарушил это основное правило и произвольно урезал результат.
В результате при попытке сохранить продукт в столбце, который принимает меньшее количество цифр, вы получаете ошибку переполнения. SQL Server не будет автоматически изменять количество цифр, потому что нет способа решить правильное действие.
Есть целый lot of ways вы можете справиться с этим, в зависимости от потери точности вы готовы страдать:
- Обрезать лишние цифры, то есть выбросить их, принимая до потери единицы. Это может стать большим количеством денег, если вы храните итоговые суммы.
- Круглый до нужного количества цифр. Звучит интуитивно, но как насчет полутоновых значений, то есть 0,00005 в вашем случае? Должно ли оно 0,0001 или 0,0000?Таким образом, мы имеем
- Округление, где 0,5 становится 1, в результате чего до .5 потери на запись
- вниз, когда он становится равным 0, с той же потерей
- Круглом к четным или нечетным, где круглый к ближайшее нечетное или четное число, которое в среднем дает минимальные потери. Хотя это звучит странно, это - это стандарт, определенный в IEEE 754. Он также называется
banker's rounding
, потому что он используется в бухгалтерском учете, чтобы минимизировать потери из-за усечения.
Если вы хотите сохранить меньшее количество цифр, вам нужно решить, нужно ли урезать лишние цифры или как округлить число, а затем сделать это самостоятельно в коде.
В вашем случае вы можете использовать CAST
с точностью до нужной точности. Это будет выполнять округление половину вверх, где 0,00005 становится 0.0001, например:
INSERT INTO TNAME2(SIZE, PRICE, TOTAL)
SELECT
SIZE, PRICE, CAST(SIZE * PRICE as numeric(14,5)) AS TOTAL
FROM
TNAME
SQLFiddle here
Это будет работать, если количество цифр не превышает 14, в противном случае вам придется изменить тип вашего поля таблицы.
Если вам нужен другой тип округления в SQL, вам нужно будет создать свою собственную функцию.
_ Интересно, почему третий столбец возвращается с 10 цифрами после десятичной точки? _ То что это должно быть? –
Продукт из двух факторов логически приведет к более высокой точности. Если вы его обходите, вы можете потерять информацию. –