我将500/15分开,然后将结果乘以15,但在不同的精度和比例上得到不同的结果。
请运行以下脚本。
DECLARE @cost DECIMAL(36,4)
SET @cost = 500
SELECT @cost/15, (@cost/15) * 15
-- Scale is 4 so on multlyping, after dividing, result is not 500
-- Result = 33.333333, 499.999995
DECLARE @cost2 DECIMAL(36,5)
SET @cost2 = 500
SELECT @cost2/15, (@cost2/15) * 15
-- Scale is 5 so on multlyping, after dividing, result is 500
-- Result = 33.3333333, 500.000000
DECLARE @cost3 DECIMAL(32,5)
SET @cost3 = 500
SELECT @cost3/15, (@cost3/15) * 15
-- Precision decrease to 32 from 36 result is again not 500
-- Result = 33.33333333, 499.99999995
我需要将此计算存储在db中,我需要最大的准确性。这不是某种科学应用,但客户需要这样做。
我想知道的是,我需要精确度给我十进制(36,5)。我应该使用这个因为它需要17个字节吗? 什么是更好的方法来获得我在实例中解释的准确性?
答案 0 :(得分:1)
转换的问题是DECIMAL(36,4)在技术上不足以将500的除法的中间结果存储为15. SQL Server正确地将其估计为FLOAT。
正确的做法是首先乘以然后除以。
DECLARE @cost DECIMAL(36,4)
SET @cost = 500
SELECT @cost/15, @cost*15/15
-- Scale is 4 so on multlyping, after dividing, result is not 500
-- Result = 33.333333, 500