【发布时间】:2014-08-18 20:55:21
【问题描述】:
我在编写的程序中遇到了一个不寻常的怪癖,我试图弄清楚是否有人知道原因。请注意,修复问题非常简单。我只是无法弄清楚为什么会发生这种情况。
我有一个用 VB.NET 编写的 WinForms 程序,它显示数据的子集。它包含一些显示数值的标签(标签的.Text 属性直接从十进制值分配)。这些数字由我用 C# 编写的 DLL 返回。 DLL 调用最初返回相关值的 web 服务。它返回一个作为字符串,另一个作为小数返回(我对 web 服务没有任何控制,我只是使用它)。 DLL 将这些分配给对象的属性(两者都是小数),然后将该对象返回给调用 DLL 的 WinForm 程序。显然,Web 服务还消耗了许多其他数据,但没有发生其他可以修改这些属性的操作。
所以,简短的版本是:
- WinForm 从 DLL 请求一个新的
Foo。 - DLL 创建对象
Foo。 -
DLL调用webservice,返回
SomeOtherFoo。//Both Foo.Bar1 and Foo.Bar2 are decimals Foo.Bar1 = decimal.Parse(SomeOtherFoo.Bar1); //SomeOtherFoo.Bar1 is a string equal to "2.9000" Foo.Bar2 = SomeOtherFoo.Bar2; //SomeOtherFoo.Bar2 is a decimal equal to 2.9D -
DLL 将 Foo 返回给 WinForm。
WinForm.lblMockLabelName1.Text = Foo.Bar1 //Inspecting Foo.Bar1 indicates my value is 2.9D WinForm.lblMockLabelName2.Text = Foo.Bar2 //Inspecting Foo.Bar2 also indicates I'm 2.9D
那么,有什么怪癖呢?
WinForm.lblMockLabelName1.Text 显示为 "2.9000",而 WinForm.lblMockLabelname2.Text 显示为 "2.9"。
现在,我所知道的关于 C# 和 VB 的一切都表明,最初被解析为小数的字符串的格式应该与稍后在同一个小数上调用的 decimal.ToString() 操作的结果无关。我希望decimal.Parse(someDecimalString).ToString() 会返回没有任何尾随零的字符串。我在网上找到的所有东西似乎都证实了这一点(有无数 Stack Overflow 的问题正好相反……如何保持初始解析的格式)。
目前,我刚刚从被解析的初始字符串中删除了尾随零,这隐藏了这个怪癖。不过,我很想知道为什么会这样。
【问题讨论】:
-
我会将
SomeOtherFoo.Bar2的声明修改为设置为 2.9000D,以使它们真正“等效”。我的想法是Parse保留小数精度,即使右 3 位数字为 0。 -
不知道这是否能解决你的怪癖,但前段时间我遇到了一些双精度和小数解析问题,
Decimal.Parse(stringNumber,CultureInfo.InvariantCulture)为我完成了这项工作 -
两位小数真的一样吗? Foo.Bar1==Foo.Bar2 吗?
-
@JoelEtherton 我无法控制 SomeOtherFoo。它是由我正在使用的网络服务返回给我的。不过,如前所述,我并不特别关心“修复”它——我已经这样做了。问题是是否有人知道它为什么会发生,而一切似乎都表明十进制不应该保留最初的格式。您提到了精度……但不是所有小数本质上都具有相同的精度吗?
-
我刚刚像这样快速测试了你的代码,它产生了
2.9000var somemString = decimal.Parse("2.9000").ToString();你在那个标签上设置了一些最大长度还是什么
标签: c# asp.net vb.net winforms