c# - 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;
}
}
亲切的问候
解决方案
这里的主要问题是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.Single和System.Double文档中指定的限制。
即使 System.Single 说:
单个值具有最多 7 位小数的精度,尽管内部维护最多 9 位
(我的重点)
这 9 位数字可能是临时的,而数字在表达式评估期间处于飞行状态。处理器寄存器略大,因此比最终存储值的数据类型更精确。
推荐阅读
- swift - 在异步函数中将数据传递给同步调用
- python - 如何更新 Tkinter 标签中的类对象属性
- algorithm - What less obvious tests could this be failing on?
- aframe - 不适用于谷歌浏览器的安卓手机
- javascript - 使用某种方法编写一个函数,检查数组中的项目是否等于 null (JavaScript)
- javascript - 为什么在手机上返回“身份不明”?
- jwt - 为什么在 jwt 标头中发送算法
- c# - Azure Devops 上的 Msbuild 任务:无法创建 /bin/debug,因为已存在同名文件或目录。(MSB3021、MSB3026、MSB3027)
- perl - Perl:可以将字符串转换为矢量标志
- android - 我的网站背景无法在移动设备上正确呈现