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

问题描述:

简而言之,我想知道为什么下面的ToString()行不符合我的期望。需要帮助了解C#浮点字符串格式化

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) 

有人可以解释发生了什么吗?

注意: 我不认为浮点值是准确的,每浮点数的其他问题。不过,我确实希望字符串输出反映所讨论的浮点数的字符串值。

在这种情况下,如果我设置了一个断点并在快速查看中查看'actual'的值,它不会显示'111253.5',它会显示'111253.469'。我不明白为什么打印时不会这样。特别是在货币情况下,我期望它将四舍五入到适当的小数点,然后显示,而不是选择其他字面值。这不是一个数学问题,它是一个ToString()行为问题。

编辑: 每Quantic的评论下面,它出现在ToString使用G格式默认情况下,限制数量7显著位,导致这里被看到的数量。

+2

不可能。 111253将永远不会给出11253作为输出 –

+0

@ThomasWeller对不起,我的评论线不准确(不包括第一个1),但它是扔给我的小数部分,对不起。我会纠正的。 – SWC

+0

如果你想要小数点上的两个数字,你可以使用下面的例子:ToString(“0.00”); ToString(“n2”); //代码为 ToString(“c2”); //对于货币 – tdog

根据MSDN about 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"返回s 111253.47

您没有ToString()问题,您有浮点数问题。

一个float是一个浮点值,通过定义有7位精度:MSDN

现在,你有超过7位数:float actual = 111253.469F,所以系统查房至少显著的人,你会得到111253.5作为您的操作的结果,您可以使用。 请注意,double的计算是正确的,因为它可以处理超过7位有效数字。