0

更新

就是这么简单...

当我尝试将值$ 1.50从文本框转换为十进制变量时,如下所示:

decimal value = Convert.ToDecimal(textbox1.text.SubString(1));

OR

decimal value = Decimal.Parse(textbox1.text.SubString(1));

我得到这个结果:1.5
我知道1.51,50的价值是一样的。但我想知道十进制变量的点后是否可以有两位数。

我希望得到这个结果:1.50而不是1.5,即使这两个值的价值相同......

4

2 回答 2

2

我希望得到这个结果:1.50 而不是 1.5,即使这两个值的价值相同..

你有 1.50 或 1.500 或 1.5000。一切都取决于您决定如何格式化/打印它。

您的十进制值以浮点格式存储。您看到的小数点数是关于输出的,而不是存储的(至少在达到特定二进制格式的精度限制之前,小数点后 2 位还差得远)。AC# Decimal 最多可存储 29 位有效数字。

请参阅此参考。它给出了一个货币格式的例子。它打印如下内容:

我的金额 = 1.50 美元

但是,您没有存储 $ 符号......那么它来自哪里?“1.50”来自同一个地方,它在您的格式说明符中。

http://msdn.microsoft.com/en-us/library/364x0z75.aspx

Console.WriteLine("My amount = {0:C}", x); 
var s = String.Format("My amount = {0:C}", x); 

这与说,我如何存储 1/3(重复小数)没有什么不同?

嗯,它不是 0.33,但如果我只看前 2 位数字,那么它就是 0.33。我看的越近(我在格式中要求的小数位越多),我得到的越多。0.33333333333333... 但这不等于 0.330

于 2014-05-15T22:08:54.777 回答
1

您将数值的存储与将其呈现为字符串(显示)混淆了。

decimal a=1.5;
decimal b=1.50;
decimal c=1.500;

在内存中:保留零以跟踪所需的精度。请参阅下面 Chris Dunaway 评论中的链接。

但是,请注意这些测试:

(a==b) = true
(b==c)=true

解析忽略尾随零,因此您的示例创建它们,然后它们被忽略,因为它们在数学上无关紧要。

现在如何转换为字符串是另一回事:a.ToString("N4") 返回字符串“1.5000”(b. 和 c. 相同)

a.ToString("N2") 返回字符串“1.50”

正如评论中的链接所解释的,如果您只是使用 a.ToString,则保留尾随零。

如果您将其作为“十进制”类型存储在数据库列中,则可能是另一回事——我还没有研究过结果。这些是 .Net 使用的规则,虽然数据库可能使用不同的规则,但这些行为通常遵循官方标准,因此如果您进行研究,您可能会发现数据库的行为方式相同!

要记住的重要一点是,数字在内存中的存储方式和它们以字符串表示的方式是不同的。浮点数可能不会以这种方式保留尾随零,这取决于该类型的内存存储规则(通常由标准机构以非常具体、详细的方式设置)。

于 2014-05-15T22:11:05.237 回答