C# Float.ToString("0.###") 将十进制数/舍入数截成int

C# Float.ToString("0.###") cuts decimal numbers / rounds number to int

我有一个带有浮点数 属性 的对象,我想将其放入文本字​​段中。问题是,如果我通常用“.ToString()”转换它,它是用科学记数法 i 写的。 e. “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;
        }
    }

亲切的问候

我不知道为什么,但是如果我将浮点数放在 double 中它就可以了。所以这有效:

double testFloat2 = (keyValuePair.Value as JsonFloat).Property; // -3740295.25
string testString2 = testFloat2.ToString("0.###"); // -3740295.25

如果有人知道为什么,那么我将不胜感激

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

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

这里,我举个例子:

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

输出:

1234568000

如您所见,该数字被“截断”并四舍五入,只有大约 7 个最重要的数字保留了 float

这也是它与 double 配合使用效果更好的原因,但它的精度也有限,只是一个上限。

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

输出:

12345678901234600000

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

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

尽管 System.Single 说:

A Single value has up to 7 decimal digits of precision, although a maximum of 9 digits is maintained internally

(我的重点)

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