需要帮助了解 C# 浮点字符串格式
本文关键字:字符串 格式 帮助 了解 | 更新日期: 2023-09-27 18:17:03
简而言之,我想知道为什么下面的ToString((行不符合我的期望。
float actual = 111253.469F;
double rounded = Math.Round(actual, 2); // 111253.47 (expected)
string stringified = actual.ToString(); // 111253.50 (expected 111253.469)
string currency = actual.ToString("C"); // $111253.50 (expected 111253.47 or possibly .46)
有人可以解释一下发生了什么吗?
注意:根据浮点数的其他问题,我不希望浮点值是准确的。但是,我确实希望字符串输出能够反映所讨论的浮点数的字符串值。
在这种情况下,如果我设置断点并在快速手表中查看"实际"的值,它不会显示"111253.5",而是显示"111253.469"。我不明白为什么在打印时也不会是这种情况。特别是在货币情况下,我希望它四舍五入到适当的小数点然后显示,而不是选择其他文字值。这不是一个数学问题,而是一个ToString((行为问题。
编辑:根据Quantic下面的评论,ToString
似乎默认使用G
格式,该格式将数字限制为7位有效数字,导致在此处看到该数字。
根据MSDN关于Single.ToString(((强调我的(:
默认情况下,返回值仅包含 7 位精度,尽管内部最多保持 9 位数字。如果此实例的值大于 7 位,则 M:System.Single.ToString(System.String( 返回 P:System.Globalization.NumberFormatInfo.PositiveInfinitySymbol 或 P:System.Globalization.NumberFormatInfo.NegativeInfinitySymbol,而不是预期的数字。如果需要更高的精度,请使用"G9"格式规范指定格式,该规范始终返回 9 位精度,或"R"(如果数字可以用该精度表示,则返回 7 位数字,如果数字只能以最大精度表示,则返回 9 位数字。
因此,您的代码示例的行为与文档完全相同:
-
ToString()
默认使用"G"
,这将使用 7 位精度 -
ToString("C")
还将使用 7 位精度
"R"
和 "G9"
都会返回111253.469
,"G8"
返回111253.47
。
您没有 ToString(( 问题,您有浮点问题。
float
是一个浮点值,根据定义具有 7 位精度:MSDN
现在,您有超过 7 位数字:float actual = 111253.469F
,因此系统会对最低有效数字进行四舍五入,并且由于您的操作,您会得到 111253.5。请注意,双精度计算正确,因为它可以处理超过 7 个有效数字。