十进制将解析字符串的精度存储在C#中?这意味着什么?

十进制将解析字符串的精度存储在C#中?这意味着什么?,c#,string,decimal,string-formatting,C#,String,Decimal,String Formatting,在IRC的一次对话中,有人指出: decimal.Parse("1.0000").ToString() // 1.0000 decimal.Parse("1.00").ToString() // 1.00 decimal类型如何/为什么保持这样的精度(或者更确切地说是有效数字)?我的印象是这两种价值观是相等的,而不是不同的 这也提出了进一步的问题: 在数学运算中,有效数字的数量是如何确定的 序列化过程中是否保留有效数字的数量 当前文化是否会影响处理此问题的方式 A由一个96位整数和一个比例因

在IRC的一次对话中,有人指出:

decimal.Parse("1.0000").ToString() // 1.0000
decimal.Parse("1.00").ToString() // 1.00
decimal
类型如何/为什么保持这样的精度(或者更确切地说是有效数字)?我的印象是这两种价值观是相等的,而不是不同的

这也提出了进一步的问题:

  • 在数学运算中,有效数字的数量是如何确定的
  • 序列化过程中是否保留有效数字的数量
  • 当前文化是否会影响处理此问题的方式
A由一个96位整数和一个比例因子(小数点后的位数)组成,范围从0到28。因此:

  • 1.000变为1000,比例因子为3

在数学运算过程中,有效数字的数量是如何确定的?

这在C#4规范11.1.7 p.112中有规定

小数点表示为按十的幂缩放的整数。对于 绝对值小于1.0m的小数,该值精确到 至少保留小数点后第28位。对于具有绝对值的小数 大于或等于1.0m,该值至少精确到28 数字

序列化过程中有效数字的数量是否保留?

是的,通过序列化,值及其精度不会改变

[Serializable]
public class Foo
{
    public decimal Value;
}

class Program
{
    static void Main(string[] args)
    {
        decimal d1 = decimal.Parse("1.0000");
        decimal d2 = decimal.Parse("1.00");

        Debug.Assert(d1 ==d2);

        var foo1 = new Foo() {Value = d1};
        var foo2 = new Foo() {Value = d2};

        IFormatter formatter = new BinaryFormatter();
        Stream stream = new FileStream("data.bin", FileMode.Create, FileAccess.Write, FileShare.None);
        formatter.Serialize(stream, d1);
        stream.Close();

        formatter = new BinaryFormatter();
        stream = new FileStream("data.bin", FileMode.Open, FileAccess.Read, FileShare.Read);
        decimal deserializedD1 = (decimal)formatter.Deserialize(stream);
        stream.Close();

        Debug.Assert(d1 == deserializedD1);

        Console.WriteLine(d1); //1.0000
        Console.WriteLine(d2); //1.00
        Console.WriteLine(deserializedD1); //1.0000

        Console.Read();
    }
}
当前文化是否会影响处理方式?

当前区域性仅影响从字符串解析小数的方式,例如,如果您提供它,它可以将“”或“”、“”作为特定于区域性的小数点符号或货币符号处理,例如“123.4500英镑”。区域性不会改变对象内部存储的方式,也不会影响其精度


在内部,一个尾数、一个指数和一个符号,因此没有空间放置任何其他内容。

除了我在这里看到的帖子,我个人会添加一个旁注:

在浮点/十进制/双数的持久化操作中,考虑<代码>文化< /代码>。这里编写的代码是第一个,但它最终将完成混乱和非文化独立的体系结构

使用


我认为,必须从库中删除缺少
区域性
参数的方法(
Parse From/To
),以迫使开发人员考虑这一非常重要的方面。

至于它:十进制值的二进制表示法由一个1位符号、一个96位整数和一个比例因子组成,该比例因子用于除以96位整数,并指定其中哪部分是小数。比例因子隐式为数字10,其指数范围为0到28。“--比例因子是一个离散分量。@pst-那么比例因子是否只对有效数字负责?i、 e.
1.0000
10000/10^4
1.00
100/10^2
数学运算和序列化如何影响比例因子?比例因子包含在十进制值的序列化形式中,通过调用GetBits方法获得。此外,如文档中所述,“零不会影响算术或比较运算中十进制数的值。”回答得非常好!非常感谢:)