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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 22:15:05