首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >ToString(IFormatProvider)的奇数小数类型行为

ToString(IFormatProvider)的奇数小数类型行为
EN

Stack Overflow用户
提问于 2012-12-11 07:12:14
回答 3查看 968关注 0票数 1
代码语言:javascript
复制
var numberFormat = new NumberFormatInfo();
numberFormat.NumberDecimalSeparator = ".";
numberFormat.NumberDecimalDigits = 2;

decimal a = 10.00M;
decimal b = 10M;

Console.WriteLine(a.ToString(numberFormat));
Console.WriteLine(b.ToString(numberFormat));
Console.WriteLine(a == b ? "True": "False");

控制台: 10.00 10 True

为什么会有所不同?更重要的是,无论变量是如何初始化的,我如何调用ToString()来确保相同的输出?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2012-12-11 07:18:37

NumberDecimalDigits属性用于"F""N"标准格式字符串,而不是在没有格式字符串的情况下调用的ToString方法。

您可以使用:

代码语言:javascript
复制
Console.WriteLine(a.ToString("N", numberFormat));
票数 2
EN

Stack Overflow用户

发布于 2012-12-11 07:38:23

如何使其输出一致的问题已经得到了回答,但这里是为什么它们的输出从一开始就不同:

decimal值在内部包含小数位数和系数的字段。在10M的情况下,编码的值的系数为10,刻度为0:

代码语言:javascript
复制
10M = 10 * 10^0

10.00M的情况下,编码的值的系数为1000,比例为2:

代码语言:javascript
复制
10.00M = 1000 * 10^(-2)

您可以通过检查内存中的值来查看这一点:

代码语言:javascript
复制
unsafe
{
    fixed (decimal* array = new decimal[2])
    {
        array[0] = 10M;
        array[1] = 10.00M;
        byte* ptr = (byte*)array;

        Console.Write("10M:    ");
        for (int i = 0; i < 16; i++)
            Console.Write(ptr[i].ToString("X2") + " ");

        Console.WriteLine("");

        Console.Write("10.00M: ");
        for (int i = 16; i < 32; i++)
            Console.Write(ptr[i].ToString("X2") + " ");
    }
}

输出

代码语言:javascript
复制
10M:    00 00 00 00 00 00 00 00 0A 00 00 00 00 00 00 00
10.00M: 00 00 02 00 00 00 00 00 E8 03 00 00 00 00 00 00

(0xA为十六进制10,0x3E8为十六进制1000 )

在C#规范的2.4.4.3节中概述了这种行为:

以M或m为后缀的实数字面值属于decimal类型。例如,文字1m、1.5m、1e10m和123.456M都是decimal类型。此字面值通过取精确值转换为十进制值,如有必要,使用银行家舍入将其舍入到最接近的可表示值(§4.1.7)。除非值是四舍五入的或值为零(在后一种情况下,符号和比例将为0),否则将保留文字中明显的任何比例。因此,将解析文字2.900m以形成符号为0、系数为2900、小数位数为3的小数。

票数 4
EN

Stack Overflow用户

发布于 2012-12-11 07:19:53

试试这个:

代码语言:javascript
复制
Console.WriteLine(String.Format("{0:0.00}", a)); 
Console.WriteLine(String.Format("{0:0.00}", b)); 

输出将始终有2个小数位数。这里有更多的例子:

http://www.csharp-examples.net/string-format-double/

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13810922

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档