SQL Server中语义相同的语句为何返回不同BIGINT结果?
问题原因解释
核心差异在于两条语句的中间计算使用了不同的数据类型,导致精度表现不同:
第一条语句的计算过程:
10e10是SQL Server默认的float(浮点数)类型,浮点数属于近似数值类型,它通过二进制存储数据,无法精确表示所有十进制整数——尤其是当数值的有效位数超过浮点数的精度范围(float约15-17位有效数字)时,会产生微小的近似误差。10e10 * 3539628的精确值是353962800000000000,但float无法精确存储这个数,实际计算出的结果会和精确值有细微偏差;后续加上3539628再转成bigint时,这个偏差被保留,最终结果出现误差。
第二条语句的计算过程:
353962800000000000是在bigint类型范围内的整数(bigint的取值范围是-9223372036854775808到9223372036854775807),SQL Server会将其识别为bigint(整数类型属于精确数值类型)。- 两个
bigint数值相加是完全精确的整数运算,不会产生任何近似误差,因此最终转换后的结果是准确的。
如果要生成唯一且精确的bigint数值,务必避免用浮点数参与中间运算,全程使用整数类型的操作才能保证结果的准确性。
内容的提问来源于stack exchange,提问作者Boris Handžiski
相关产品推荐
相关产品推荐

