首页 > 解决方案 > C# Float.ToString("0.###") 将十进制数/四舍五入到 int

问题描述

我有一个带有浮动属性的对象,我想将其放入文本字​​段中。问题是,如果我通常用“.ToString()”转换它,它是用科学记数法写的,即“1.5E+07”(它会去掉我所有的小数点)。因此,我想用可选的数字参数“#”对其进行转换,所以我写了“.ToString("0." + new string('#', 339)" 以保证它只会从我的浮点数,但写入所有其他数字。无论我使用它还是只使用“0.###”,它总是会删除我所有的十进制数字。即“-3740295.25”(浮点数)变成“-3740295”(字符串)。

我真的不明白为什么会发生这种情况,也没有在互联网上找到任何类似的东西,而且大多数转换都是关于字符串的双精度数(这对我也不起作用)。

编辑:

这里要求的是一个代码片段,它让我意识到,如果我创建一个全新的浮点数它就可以工作,我不知道为什么它不能与对象中的浮点数一起工作:

float testFloat1 = 1234.5544f;
float testFloat2 = (keyValuePair.Value as JsonFloat).Property; // -3740295.25
string testString1 = testFloat1.ToString("0.###"); // 1234.554
string testString2 = testFloat2.ToString("0.###"); // -3740295

简而言之,这是一个对象:

public partial class JsonFloat : JsonValue
    {
        public float Property { get; set; }

        public JsonFloat(float property)
        {
            Property = property;
        }
    }

亲切的问候

标签: c#floating-pointtype-conversiontostringdecimalformat

解决方案


这里的主要问题是float映射到的System.Single根本没有足够的精度。

而且精度不是小数点后的位数,精度是整数。

在这里,我给你举个例子:

float f = 1234567890f;
Console.WriteLine(f.ToString("################"));

输出:

1234568000

如您所见,该数字被“截断”并四舍五入,只有大约 7 个最高有效数字与float.

这也是它与 一起工作得更好的原因double,但这也有有限的精度,只是一个上限。

double d = 12345678901234567890d;
Console.WriteLine(d.ToString("##############################"));

输出:

12345678901234600000

正如您在此处看到的,double保留了更多的数字,但随后放弃了大约 15 个有效数字。

您可以查看System.SingleSystem.Double文档中指定的限制。

即使 System.Single 说:

单个值具有最多 7 位小数的精度,尽管内部维护最多 9 位

(我的重点)

这 9 位数字可能是临时的,而数字在表达式评估期间处于飞行状态。处理器寄存器略大,因此比最终存储值的数据类型更精确。


推荐阅读