十进制数不会在.net中保存小数位

时间:2016-01-14 15:26:34

标签: .net decimal

我正在阅读SOA webservice,它以十进制格式返回值。要求是我们需要显示值的任何服务返回(包括小数位)。我遇到的问题是,每当铸造0位小数后小数位后面的0值被删除。例如在decimal1和decimal3中,它将返回123和123.1去掉最后一个小数位。

decimal decimal1 =  (decimal) 123.00;  --returns 123
decimal decimal2 = (decimal) 123.01;   --returns 123.01
decimal decimal3 = (decimal) 123.10;   --returns 123.1

有没有办法让我可以得到小数位而不会在最后丢失0值?结束数据类型必须是十进制(或数值),不能是字符串。 感谢

Sanjeev

4 个答案:

答案 0 :(得分:3)

您的问题是123.10doubledouble不会保留decimal等精确信息。

因此123.10的基本表示等于123.1 ==> decimal的演员阵容发生得太晚

解决方案是使用decimal后缀在源代码中声明m字面值。

var decimal1 = 123m;
var decimal2 = 123.10m;

decimal1.ToString() // gives "123";
decimal2.ToString() // gives "123.10";

答案 1 :(得分:0)

如果您想保留数字,则需要转换为字符串:

Convert.ToDecimal("1.10")
Convert.ToDecimal("1.1")

因为没有保留它们是浮动的。

Float并没有记得"十进制数字。在编译期间,所有十进制浮点字面值都将转换为它们的二进制对应值,并且十进制0-s将丢失:

csharp> BitConverter.GetBytes(1.1)
{ 154, 153, 153, 153, 153, 153, 241, 63 }
csharp> BitConverter.GetBytes(1.10)
{ 154, 153, 153, 153, 153, 153, 241, 63 }

答案 2 :(得分:0)

您在这里担心的是如何将小数格式化为string,您可以使用.ToString()的各种覆盖来控制它。 "数据' decimal值保持不变,无论它如何作为字符串输出。

答案 3 :(得分:0)

正如其他人所提到的,十进制是一种不关心其格式化的值类型,它关心它如何持续精确的十进制。将十进制表示为人类可读的字符串应由表示层处理,并且在该层中,十进制应从十进制类型转换为字符串类型。在这里,您可以格式化小数,以便显示(作为字符串)小数点后的XX值,舍入,.作为分隔符或`,'取决于您的用户文化等。

请参阅Microsoft Standard Numeric Formats Strings网站,其中显示了许多可用于格式化小数的现有方法(以及其他类型)。

您需要做的是使用N / Number格式说明符。

decimal decimal1 =  123M;
var myFormattedString = decimal1.ToString("N2");