I have a field where I'm using LEN()
to calculate the string length and then I'm comparing this to a value generated by AVG(CONVERT(FLOAT,LEN(some_field)))
.
The point of the comparison is to do THIS if the first value is less than the second and THAT when the value is greater than.
My question is this: when comparing 2 values of the data types above, at what decimal place does the system stop using further decimal places for the floating point value and then decide to round it?
As an example, the comparison is 10
compared to 9.5
. So it will pick one of the options (doesn't matter which). But then what about 10
compared to 9.99999999999999999
? Will the system decide that 9.99999999999999999
is actually 10
, thus ruining the point of the comparison?
答案 0 :(得分:0)
回答这个问题需要两个部分。
当比较上面数据类型的2个值时,系统停止使用小数点后面的浮点值进一步使用小数位,然后决定舍入它?
发生浮点数舍入或截断的 limit 取决于系统对该数据类型的精度。对于float,它最多为15位数。
以您的代码为例,如果您有11个字符串,总长度为29,AVG
将返回:2.63636363636364(一个非终止,重复的数字)终止于第15位。
如果您尝试将9.99999999999999999表示为浮点数,它将舍入为10.
我使用LEN()来计算字符串长度,然后我将其与AVG(CONVERT(FLOAT,LEN(some_field))生成的值进行比较。
但那么10比较9.99999999999999999呢?系统会决定9.99999999999999999实际上是10,从而破坏了比较点吗?
首先,请注意AVG()
返回类型是基于参数的数据类型(请参阅"返回类型" https://msdn.microsoft.com/en-GB/library/ms177677.aspx部分),因为如果您明确将LEN(some_field)
值转换为浮点数,则AVG()
结果将始终为浮点值。如果您需要更高的精度和比例,例如9.99999999999999999,请考虑将参数转换为decimal
。
其次,因为LEN()
返回int
类型的值,而AVG()
返回的值如上所述可能不是int
,所以您的比较'在两种不同数据类型的值之间,Data Type Precedence开始发挥作用。