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.Single
的 float
根本没有足够的精度。
而且精度不是指小数点后的数字,精度是指整数。
这里,我举个例子:
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 位数字可能是临时的,而数字在表达式计算期间处于飞行状态。处理器寄存器稍大,因此比最终存储值的数据类型更精确。
我有一个带有浮点数 属性 的对象,我想将其放入文本字段中。问题是,如果我通常用“.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.Single
的 float
根本没有足够的精度。
而且精度不是指小数点后的数字,精度是指整数。
这里,我举个例子:
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 位数字可能是临时的,而数字在表达式计算期间处于飞行状态。处理器寄存器稍大,因此比最终存储值的数据类型更精确。