需要帮助了解 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位有效数字,导致在此处看到该数字。

需要帮助了解 C# 浮点字符串格式

根据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 个有效数字。