1

我有一个字段,我使用LEN()来计算字符串长度,然后我将它与AVG(CONVERT(FLOAT,LEN(some_field)))生成的值进行比较。在SSRS中比较Float和Int

比较的点是做THIS如果第一值小于所述第二和THAT当该值大于。

我的问题是:当比较上述数据类型的2个值时,系统停止使用更多小数位作为浮点值,然后决定舍入它?

作为示例,比较结果为109.5相比较。所以它会选择其中一个选项(哪个不重要)。但那么109.99999999999999999相比呢?系统会判定9.99999999999999999实际上是10,从而破坏了比较的重点?

回答

0

有两个部分需要回答这个问题。

当比较上述数据类型的2个值时,系统停止使用更多小数位作为浮点值,然后决定舍入它吗?

限制在该浮点数的舍入或截断发生是基于系统的精度该数据类型。对于float,它最多为15位数字。

以您的代码为例,如果您有11个字符串,总长度为29,AVG将返回:2.63636363636364(非终止重复号码)终止于第15位数字。

如果你尝试和代表9.99999999999999999为float,它会四舍五入为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两个不同数据类型的值之间的用武之地。