如何防止 double.Parse 在小数点后去除尾随零?

6
当使用double.Parse时,它似乎喜欢将我要转换的字符串中的任何尾随(无关紧要的)零去掉。我希望double.Parse保留小数点后两位。例如,这里是一些代码:
tobereturned.MouseSensitivty = double.Parse(String.Format("{0:#.##}", tempstring[1]));
Debug.WriteLine("Converted " + String.Format("{0:#.##}", tempstring[1]) + " to " + tobereturned.MouseSensitivty);

调试器随后写入:

将4.00转换为4

因此,double.Parse似乎在这里做了一些奇怪的事情。 P.S. MouseSensitivity也是double类型,所以我无法对它进行任何字符串操作。


我不认为double.Parse做了任何奇怪的事情。Number.FormatDouble()函数可能是将您的数字呈现为没有小数位的形式。(这是Double.ToString()调用的函数。) - jwwishart
4个回答

4

你的问题毫无意义。首先,双精度浮点数根本没有“小数点后的位数”。它们在内部不存储任何看起来像“数字的十进制表示”的东西。实际上,它们在内部不存储任何甚至看起来像可识别文本的东西。

它报告4,因为4.00恰好等于4。根据其将数字转换为文本的默认规则,它显示“没有小数部分的恰好四的数字”。

请阅读此文档。是的,它很长,很难懂,但是如果没有对这些材料的真正理解,就不可能正确地使用浮点数类型 - 无论您使用什么语言。


谢谢你向我解释。我可以理解为什么它想要切掉任何不重要的数字,尽管我有点难以理解当你说“双精度浮点数本来就没有小数位”时是什么意思。根据http://msdn.microsoft.com/en-us/library/system.double%28v=VS.90%29.aspx,看起来它们确实有:\ - gcode
1
要有“小数点后的位数”,数字必须以十进制(即基数为10)表示。但它不是。它是用二进制(即基数为2)表示的。 - Karl Knechtel
1
如果是这样的话,那么我们难道就永远无法拥有比基数2更大的数字了吗?我的意思是,我知道它必须在某个时候存储在计算机的内存中(以二进制形式),但编译器不会采取措施确保一旦再次从内存中读出该数字时它仍然是相同的吗? - gcode
2
“比基数2大的数字”是没有意义的。你用哪种基数来表示一个数字并不会限制可能数字的范围,它还取决于你使用多少位/比特。编译器不需要采取任何这样的措施。数字就是数字——这与其在文本中的表示不同。当数字被读入时,会从文本转换为内部数字格式;当数字被显示时,会将其转换回文本。这些转换并不互相抵消,通常没有理由指望它们互相抵消。 - Karl Knechtel

2

double数据类型仅仅是一个数字;它不会记录用于创建该值的字符串。只有在调用.ToString()时,它的字符串表示才会起作用。


0

如果你知道你总是想要小数点后两位,你可以使用右填充零的方法。

双精度类型并不负责跟踪你所需的显示格式。


右侧补零?使用String.Format吗? - gcode

0
Double类型不会存储冗余的零。在您的视图或展示层中,您可能希望对其进行格式化以显示您想要的样式,例如:String.Format("{0:#.##}", doubleVariable)。

那么,如果我的视图是一个 PropertyGrid,直接从变量中读取,我应该将该变量更改为字符串,并在更改时运行 Regex 匹配,以确保它仅包含数字和小数点吗? - gcode
不需要,只需打开HTML开关并在标记中使用格式{0:F2}。 - Phil C

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接