C#中Float.ToString("0.###")截断小数舍入为整数问题排查
问题成因
你遇到的截断问题本质是单精度浮点数(float)的有效位限制导致的:
- C# 中
float类型仅能保证约7位十进制有效数字的精度,超出范围的数字会被自动舍入丢弃。 - 你用到的测试值
-3740295.25仅整数部分就占了7位有效数字,剩下的小数位.25已经超出了float的精度承载范围,所以在赋值给JsonFloat.Property的阶段,.25就已经被舍入丢失了,不是字符串转换阶段的问题。 - 你本地测试的
1234.5544f整数部分仅4位,剩余3位小数刚好在7位有效数字范围内,所以可以正常保留。
你可以加一行验证代码确认这个问题:
Console.WriteLine(testFloat2 == -3740295f); // 输出会是True,说明变量里本身就没有小数部分
解决方案
方案1:更换更高精度的数值类型(优先推荐)
如果业务需要保留超过7位的有效数字,直接把 JsonFloat 类的 Property 类型从 float 换成 double 或者 decimal:
double可以保证约15~17位十进制有效数字,足够覆盖你当前的数值场景decimal适合对精度要求极高的金融等场景,不存在二进制浮点数的舍入误差
修改后你的自定义类示例:
public partial class JsonFloat : JsonValue { public double Property { get; set; } // 换成double public JsonFloat(double property) { Property = property; } }
方案2:如果必须保留float类型
使用 G9 格式符做字符串转换,这是C#官方推荐的float转字符串格式,可以输出最短的、能唯一表示当前float值的字符串,自动避免科学计数法、也不会无意义补0:
string testString2 = testFloat2.ToString("G9");
注意这个方案只能正确输出float本身实际存储的精度,依旧无法解决超出7位有效数字的数值丢失问题。
内容的提问来源于stack exchange,提问作者ds600
相关产品推荐
相关产品推荐

