始终在点后留下两位小数

时间:2014-05-15 21:25:12

标签: c# currency-formatting

更新

这很简单......

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

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

OR

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

我得到了这个结果: 1.5
我知道 1.5 1,50 值得一试。但是我想知道在十进制变量上的点之后是否可以有两位数。

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

2 个答案:

答案 0 :(得分:2)

  
    

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

  

您有1.50或1.500或1.5000。所有这些都取决于您决定格式化/打印它。

您的十进制值以浮点格式存储。您看到的小数点是关于输出,而不是存储(至少在达到特定二进制格式的精度限制之前,并且2个小数位无处接近)。 C#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,但如果我只看前两位数,那么它是0.33。我看得越近(我在格式中要求的小数点越多),我得到的越多。 0.33333333333333 ......但这并不等于0.330

答案 1 :(得分: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使用的规则,虽然数据库可能使用不同的规则,但这些行为通常遵循官方标准,因此如果您进行研究,您可能会发现数据库的行为方式相同!

要记住的重要一点是,数字存储在内存中的方式与它们表示为字符串的方式之间存在差异。浮点数可能不会以这种方式保留尾随零,它可以达到类型的内存存储规则(通常由标准组织以非常具体,详细的方式设置)。