【问题标题】:Comparing a Float with an Int in SSRS在 SSRS 中比较浮点数和整数
【发布时间】:2016-05-24 02:37:52
【问题描述】:

我有一个字段,我使用LEN() 计算字符串长度,然后将其与AVG(CONVERT(FLOAT,LEN(some_field))) 生成的值进行比较。

比较的重点是,如果第一个值小于第二个值,则进行 THIS,如果值大于第二个值,则进行 THAT

我的问题是:在比较上述数据类型的 2 个值时,系统在哪个小数位停止使用浮点值的更多小数位,然后决定对其进行舍入?

例如,比较是109.5。所以它会选择其中一个选项(没关系)。但是,与9.99999999999999999 相比,10 又如何呢?系统会判定9.99999999999999999 实际上是10,从而破坏比较的意义吗?

【问题讨论】:

    标签: sql reporting-services floating-point integer reportbuilder3.0


    【解决方案1】:

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

    当比较上述数据类型的2个值时,系统在哪个小数位停止使用浮点值的更多小数位,然后决定对其进行四舍五入?

    浮点数舍入或截断的限制取决于该数据类型的系统精度。 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 的值之间进行的发挥作用。

    【讨论】:

      猜你喜欢
      • 2015-01-20
      • 2016-02-08
      • 2011-04-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-05-13
      • 2021-09-30
      • 1970-01-01
      相关资源
      最近更新 更多