C# 为什么C没有十进制(x,y)?

C# 为什么C没有十进制(x,y)?,c#,floating-point,C#,Floating Point,为什么我不能将变量声明为: public decimal(1,1) Foo {get; set;} 在Microsoft Sql中的Sql示例中,我可以编写: DECLARE @foo DECIMAL(1,1) SET @foo = 1.0 / 3 SELECT @foo 并且与其他浮点值相比,具有很好的0.3而无需担心问题。相反,我必须编写getter和setters: public double Foo { get { return Math.Round(_foo, 4); }

为什么我不能将变量声明为:

public decimal(1,1) Foo {get; set;}
在Microsoft Sql中的Sql示例中,我可以编写:

DECLARE @foo DECIMAL(1,1)
SET @foo = 1.0 / 3
SELECT @foo
并且与其他浮点值相比,具有很好的0.3而无需担心问题。相反,我必须编写getter和setters:

public double Foo
{
    get { return Math.Round(_foo, 4); }
    set { _foo = Math.Round(value, 4); }
}
我需要精确到0.xxxx

更新: 简单的例子:

JsonSerializer.DeserializeFromReaderreader为我提供的值为14.16904729,其他来源的数据为14.1690472890166。这是单元测试的数据集,我不能:

result.ShouldBeEquivalentTo(expected);

因为浮点表示。现在我必须排除一些字段,写入setter和getter。

因为您不能?我的意思是,拜托-在.NET中有一个定义的十进制数据类型,它没有功能,因为它被认为不重要。想争论一下.NET langauge开发人员对此有什么看法吗?这是离题的

我个人觉得.NET中的十进制情况非常令人失望,根据IEE754标准,我喜欢十进制32、十进制64和十进制128,在SQL Server中也是如此

但是,我想要什么和它想要什么有两件事,我不负责这些部分,也不能做出这些改变。一个更统一、更灵活的系统——根据IEE标准,在顶部,将是非常好的。

或者可能是您可以使用的

decimal _Foo;

public decimal Foo{
get{
    return Foo;
}
set {
    _Foo =new decimal(X,X,X,X,X); // you can use here your scale or precision
}
}

或者,你知道,使用而不是double…因为C不是SQL。另外,C也不支持存储过程和视图,顺便说一句。@Damien_我问的是关于小数x,y不是小数的问题。@DavidHeffernan SQL示例是为了说明这个问题…这如何限制存储在字段中的值?或者你现在知道小数点1,1在sql中的作用了吗,但你还是想推荐一些你不知道的东西吗?正如我所知,小数点1,1是sql:第一个是数字的长度,第二个是固定的小数点大小,我不会评判Pople或试图成为一个聪明的AXX@Decimal的缺点不是它太大,而是它是一种浮点类型。16个字节足以容纳20.16的定点格式,这应该足以满足Decimal可以实现的所有目的;使用定点数学将比十进制浮点更快,并将避免与后者相关的许多怪癖。实际上,我的抱怨是,根据IEEE754十进制定义,十进制并不是标准的十进制,这是后来才做的,所以它浪费了空间,而且永远不会像IEEE的那样硬件加速。sql server和.net之间还没有标准化的存储系统;浮点十进制数学的时代来了又去,到了1990年,它已经相当过时了。在今天的计算硬件上,我认为唯一有意义的十进制值类型要么是长整数类型除以某个固定的比例因子,要么可能是一对数字,其比例相差五次方[例如,对于具有64位半H和L的128位类型,值应为H*16777216+L/10000000000;L的整数部分可通过右移12除以32位值244140625生成。]如果你想使用IEEE类型来表示十进制,我建议使用80位浮点值,放大15625倍。这可以准确地存储0.000001乘以任何可表示双精度的乘积。如果微软不反对80位类型,即使是在20世纪80年代早期的PC机上,calculatio有了这些,ns将比十进制快很多数量级。