十进制将解析字符串的精度存储在C#中?这意味着什么?
在IRC的一次对话中,有人指出:十进制将解析字符串的精度存储在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位整数和一个比例因
decimal.Parse("1.0000").ToString() // 1.0000
decimal.Parse("1.00").ToString() // 1.00
decimal
类型如何/为什么保持这样的精度(或者更确切地说是有效数字)?我的印象是这两种价值观是相等的,而不是不同的
这也提出了进一步的问题:
- 在数学运算中,有效数字的数量是如何确定的
- 序列化过程中是否保留有效数字的数量
- 当前文化是否会影响处理此问题的方式
- 1.000变为1000,比例因子为3
[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方法获得。此外,如文档中所述,“零不会影响算术或比较运算中十进制数的值。”回答得非常好!非常感谢:)