【问题标题】:Preventing double.Parse from removing trailing zeros after decimal place?防止 double.Parse 删除小数点后的尾随零?
【发布时间】:2010-12-11 06:49:42
【问题描述】:

当使用 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 正在在这里做一些可疑的事情。 附: MouseSensitivity 也是 double 类型,所以我不能对它做任何字符串操作。

【问题讨论】:

  • 我不认为 double.Parse 正在做任何奇怪/可疑的事情。 Number.FormatDouble() 函数可能是使您的数字不带小数位的原因。 (Double.ToString() 调用的函数。)

标签: c# double significant-digits


【解决方案1】:

你的问题毫无意义。双打一开始就没有“小数点后的位”。他们不会在内部存储任何看起来像“数字的十进制表示”的东西。事实上,它们不会在内部存储任何看起来像可识别文本的内容。

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

请阅读this。是的,它很长,也很困难,但是如果没有真正理解这种材料,就不可能正确使用浮点数字类型 - 而且它不会无论您使用什么语言。

【讨论】:

  • 感谢您向我解释这一点。我可以理解它为什么要删除任何无关紧要的数字,尽管当您说“双打一开始没有'小数点后的位置'”时,我很难理解您的意思。根据msdn.microsoft.com/en-us/library/… ,他们似乎这样做了:\
  • 要具有“小数点后的位置”,该数字必须以十进制表示(即以 10 为基数)。它不是。它以二进制表示(即基数 2)。
  • 如果是这样的话,那我们岂不是永远不能拥有比基数 2 更大的数吗?我的意思是,是的,我知道它必须在某个时间点(以二进制形式)存储在计算机的内存中,但是,编译器是否没有采取措施确保数字在读出后是相同的再次回忆?
  • “大于基数 2 的数字”是没有意义的。您表示数字的基数本身并不限制可能数字的范围;它还取决于您使用多少位/位数。编译器不需要采取任何此类措施。数字就是数字 - 它在文本中的表示不同。读入数字时,会发生从文本到内部数字格式的转换;当显示数字时,会转换回文本。这些转换不会相互抵消,而且通常没有理由期望它们会相互抵消。
【解决方案2】:

double 数据类型只是一个数字;它不跟踪被解析以创建值的字符串。它的字符串表示只有在调用.ToString() 时才起作用。

【讨论】:

    【解决方案3】:

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

    跟踪所需的显示格式不是 double 类型的工作。

    【讨论】:

    • 正确填充零?使用 String.Format 吗?
    【解决方案4】:

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

    【讨论】:

    • 因此,如果我的视图是 PropertyGrid,它直接从变量中读取,我是否应该将该变量更改为字符串,并在更改时对其运行正则表达式匹配,以确保它仅包含数字和小数?
    • nopers,只需打开 html 开关并在标记中使用格式化 {0:F2}
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-09-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多