select 'foo ' + str(1.0/3.0, 15, 12)
返回foo 0.333333000000
。是否可以提高小数精度,以使小数点后的每个数字都是3
?
答案 0 :(得分:2)
您需要提高输入值的准确性。用小数除法引用documentation时,得出的精度为p1 - s1 + s2 + max(6, s1 + p2 + 1)
,结果的小数位数为max(6, s1 + p2 + 1)
。
在您的表情中,1.0
和3.0
都是decimal(2,1)
。这意味着您得到的精度为2 - 1 + 1 + max(6, 1 + 2 + 1) = 2 + max(6,5) = 2 + 6 = 8
。对于您的比例,结果为max(6, 1 + 2 + 1) = max(6,5) = 6
。因此,您的新数据类型是decimal(8,6)
。这将导致表达式1.0 / 3.0 = 0.333333
。
然后,您将此值转换为字符串,精度为15
,小数位数为12
。 0.333333
作为decimal(15,12)
就是0.333333000000
,因为精度已经丢失; SQL Server不会记住该值在技术上是0.3~
。
因此,要获得所需的答案,您需要在初始值中添加更多的小数位。例如:
SELECT 'foo ' + CONVERT(varchar(20),CONVERT(decimal(15,12),1.000000/3.0000000));
或者,使用转化
SELECT 'foo ' + CONVERT(varchar(20),CONVERT(decimal(15,12),CONVERT(decimal(15,12),1.0)/3.0));
任何问题,请问。