You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

插入2.55到SQL Server FLOAT字段后为何返回2.5499999999999998?

为什么SQL Server中插入FLOAT类型的2.55后查询结果变成2.5499999999999998?

这可不是SQL Server的bug,而是FLOAT这类近似浮点数的固有特性导致的——简单来说,不是所有十进制小数都能被二进制精确表示,2.55就是其中之一。

原因详解

FLOAT类型采用二进制浮点存储,它的设计目标是在有限的存储空间内尽可能接近真实值,但无法保证所有十进制小数的精确性。以2.55为例,将它转换成二进制时会得到一个无限循环的小数:

2.55 = 10.10001100110011...(循环部分为0011)

数据库只能存储这个无限循环小数的近似截断值,所以当你读取时,就会看到那个看起来“奇怪”的2.5499999999999998——它是2.55在二进制浮点数存储下最接近的近似值。

解决办法

根据你的业务需求,有两种常见处理方式:

  1. 改用精确数值类型(推荐用于需要精确存储的场景)
    如果你的数据是像货币、精确计量值这类需要绝对精确的内容,别用FLOAT,改用DECIMAL(或NUMERIC,两者在SQL Server中功能一致)。比如修改你的表定义:

    CREATE TABLE test (floating_col DECIMAL(5,2)); -- 5位总长度,2位小数
    

    插入2.55后再查询,就能精确返回2.55了。

  2. 格式化显示(仅用于视觉效果,不改变底层存储)
    如果你必须使用FLOAT(比如处理科学计算类的近似数据),只是想让查询结果显示为2.55,可以用FORMAT函数做格式化处理:

    SELECT FORMAT(floating_col, 'N2') AS formatted_value FROM test;
    

    注意:这只是把近似值格式化成两位小数显示,底层存储的还是那个近似值,后续计算仍会基于近似值进行。

内容的提问来源于stack exchange,提问作者Maeh

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.14 08:45:57