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

如何将字符串"0.00003"转为非科学计数法格式的float类型

如何将字符串"0.00003"转换为非科学计数法形式的float并写入JSON

首先明确:Python的float对象本身不存储显示格式,科学计数法只是其字符串表示形式,0.00003和3e-5在数值上完全等价。你的核心需求是写入JSON时输出小数格式而非科学计数法,同时保证验证时与CSV原始格式匹配。

解决方案思路

  • 读取CSV时,用decimal.Decimal处理数值字符串,既避免float的精度丢失问题,又能保留精确的小数位数。
  • 写入JSON时,通过自定义序列化逻辑或第三方库,将数值序列化为小数格式的数字类型,而非科学计数法。
  • 验证阶段,将JSON中的数值格式化为与CSV原始字符串一致的格式进行比对。

具体实现代码

1. 读取CSV并转换数据

import csv
from decimal import Decimal

# 读取CSV文件
processed_data = []
with open("input.csv", "r", newline="") as csv_file:
    reader = csv.reader(csv_file)
    # 跳过表头(如果有)
    next(reader, None)
    for row in reader:
        # ID转为int
        item_id = int(row[0])
        # 用Decimal保留精确小数格式,避免float精度问题
        value = Decimal(row[1])
        processed_data.append({"id": item_id, "value": value})

2. 写入JSON(输出小数格式)

如果可以使用第三方库simplejson,它对Decimal的序列化支持更友好,能直接输出小数格式:

import simplejson as json

# 写入JSON,use_decimal=True会将Decimal序列化为小数数字
with open("output.json", "w") as json_file:
    json.dump(processed_data, json_file, use_decimal=True, indent=4)

如果不想依赖第三方库,自定义JSON编码器处理float/Decimal的序列化:

import json
from decimal import Decimal

class DecimalFloatEncoder(json.JSONEncoder):
    def default(self, obj):
        if isinstance(obj, Decimal):
            float_val = float(obj)
            # 判断当前float的字符串表示是否为科学计数法
            str_repr = repr(float_val)
            if 'e' in str_repr.lower():
                # 提取指数部分,生成对应位数的小数格式
                exp_digits = str_repr.split('e-')[1]
                return f"{float_val:.{exp_digits}f}"
            return float_val
        return super().default(obj)

# 写入JSON
with open("output.json", "w") as json_file:
    json.dump(processed_data, json_file, cls=DecimalFloatEncoder, indent=4)

3. 验证数据格式与值匹配

# 重新读取CSV原始数据用于验证
original_rows = []
with open("input.csv", "r", newline="") as csv_file:
    reader = csv.reader(csv_file)
    next(reader, None)
    original_rows = list(reader)

# 读取JSON并验证
with open("output.json", "r") as json_file:
    json_data = json.load(json_file)
    for json_item, original_row in zip(json_data, original_rows):
        # 提取原始字符串的小数位数,格式化JSON中的数值
        decimal_places = len(original_row[1].split('.')[1])
        formatted_value = f"{float(json_item['value']):.{decimal_places}f}"
        assert formatted_value == original_row[1], f"值不匹配:{formatted_value} vs {original_row[1]}"

关键说明

  • 若必须使用原生float类型,0.00003转float是精确的,但部分小数转float会有精度损失,因此优先推荐用Decimal处理。
  • JSON本身的数字类型没有格式概念,输出格式由序列化工具决定,通过自定义编码器或simplejson可强制输出小数格式。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.19 21:22:19