如何将字符串"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
相关产品推荐
相关产品推荐

