使用pandas to_sql()向SQL Server插入浮点数未显示小数位问题
问题原因及解决方法
核心原因
- pandas显示格式不影响实际存储:你设置的
pd.options.display.float_format只是控制DataFrame打印时的展示样式,不会改变数据本身的精度。比如100.0在DataFrame里还是float类型的100,并非带四位小数的固定精度数值。 - Float()类型不匹配SQL Server需求:你用的
Float()是pandas的可空浮点类型,对应到SQL Server后还是默认的float类型——这是近似数值类型,存储时不会强制保留小数位数,显示时会自动省略末尾的零。 - SQL Server表字段类型未指定小数精度:如果表中Price、Value字段是
float类型,SQL Server只会存储数值的近似值,不会按四位小数的格式保留。
解决方法
- 修改SQL Server表字段类型(推荐):直接把Price、Value字段改成
DECIMAL(18,4)或NUMERIC(18,4),这两种是精确数值类型,能强制保留4位小数。 - 在to_sql中指定SQLAlchemy的精确数值类型:导入SQLAlchemy的
Numeric类型,替代pandas的Float(),示例代码:from sqlalchemy import Numeric df.to_sql( name="your_table_name", con=your_engine, dtype={ "Price": Numeric(precision=18, scale=4), "Value": Numeric(precision=18, scale=4) }, if_exists="append" # 根据需求选replace/append等 ) - (不推荐)转成字符串存储:如果只需要展示格式,可将数值转成带四位小数的字符串后插入,但这种方式会丢失数值计算能力,仅适合纯展示场景。
内容的提问来源于stack exchange,提问作者iBeMeltin
相关产品推荐
相关产品推荐

