是",;十进制;输入C#二进制编码的十进制?

是",;十进制;输入C#二进制编码的十进制?,c#,floating-point,numbers,decimal,C#,Floating Point,Numbers,Decimal,我希望使用C#处理十进制货币(欧元)的价格,而不必担心舍入错误,也不必使用自己的十进制算法。说 与浮点类型相比,十进制类型具有更高的精度和更小的范围,因此适合于金融和货币计算 什么 我一点也不在乎精度,我只想要七个sig无花果。但我想知道,5.31欧元是一个精确值。A、 二进制编码的十进制类型将是理想的。所以我的问题是C#十进制是否是那种类型。不,不是(每个数字都以特定位数单独编码)-但你不希望它是这样。(当然,我从未声称这是真的。) decimal是一种浮点类型,因为它有一个有效位和一个指数,

我希望使用C#处理十进制货币(欧元)的价格,而不必担心舍入错误,也不必使用自己的十进制算法。说

与浮点类型相比,十进制类型具有更高的精度和更小的范围,因此适合于金融和货币计算

什么

我一点也不在乎精度,我只想要七个sig无花果。但我想知道,
5.31欧元
是一个精确值。A、 二进制编码的十进制类型将是理想的。所以我的问题是C#
十进制
是否是那种类型。

不,不是(每个数字都以特定位数单独编码)-但你不希望它是这样。(当然,我从未声称这是真的。)

decimal
是一种浮点类型,因为它有一个有效位和一个指数,都是整数-只是与
float
double
不同,被指数移位的“点”是一个小数点,而不是一个二进制点。不幸的是,MSDN说的是“与浮点类型相比”,而实际上它的意思是“与二进制浮点类型相比”

但事实上,该报告确实相当清楚地表明:

十进制数是一种浮点值,它由一个符号、一个数值(该数值中的每个数字的范围为0到9)和一个比例因子组成,该比例因子指示分隔数值的整数部分和小数部分的浮动小数点的位置

十进制值的二进制表示法由1位符号、96位整数和用于除以96位整数并指定其中哪部分是小数的比例因子组成。比例因子隐式为数字10,其指数范围为0到28。因此,十进制值的二进制表示形式为((-296到296)/10(0到28)),其中-(296-1)等于MinValue,296-1等于MaxValue。有关十进制值的二进制表示形式和示例的更多信息,请参阅十进制(Int32[])构造函数和GetBits方法


不要被诸如“精确性”之类的术语所困扰<代码>十进制用于货币计算;如果你使用其他任何东西,你会受到伤害。这根本不能回答问题。如果
decimal
实际上在引擎盖下使用小数,那么它就工作了。但是我仔细看过的所有文档都避免这样说,实现是不相关的。了解它是如何工作的是相关的,并且描述得足够详细:它可以很好地供您使用。@TimS。实现很重要,因为只有当内部表示是base 10时,它才可能工作。在我看到Jon的答案之前,我在文档中找不到任何可以精确存储“0.1”的东西;每个人都可以看到下面乔恩的答案,他们也可以看到你接受了正确的答案。他们也可以看到所有的评论。那不是仍然是BCD吗?它不是定点,它只是十进制的科学符号,编码为位。@AdrianRatnapala:不,那不是BCD。按照链接查看BCD的实际含义。这是因为任何十进制整数都可以精确地用基数2表示,但比例因子是基数10?我明白了。指数是十进制的,但尾数是2的补充二进制。这显然是做事情的正确方式。我本来想这么说,但我不确定