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

时间:2014-03-19 14:16:23

标签: c# floating-point

为什么我无法将变量声明为:

public decimal(1,1) Foo {get; set;}

在Sql(Microsoft Sql中的示例)中,我可以写:

DECLARE @foo DECIMAL(1,1)
SET @foo = 1.0 / 3
SELECT @foo

并且在与其他浮动值进行比较时,不会遇到binary floating point问题而感到满意0.3。相反,我必须把吸气剂写成一个二传手:

public double Foo
{
    get { return Math.Round(_foo, 4); }
    set { _foo = Math.Round(value, 4); }
}

我需要精确到0.xxxx。

更新

简单示例:

JsonSerializer.DeserializeFromReader(reader)给出的值为14.16904729,其他来源的数据为14.1690472890166。这是单元测试的数据集,我不能只是:

result.ShouldBeEquivalentTo(expected);

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

2 个答案:

答案 0 :(得分:4)

因为你不能?我的意思是,来吧 - 在.NET中有一个定义的十进制数据类型,它没有功能,因为它不被认为是重要的。想要争论.NET langauge dev对此有何看法?这是偏离主题的。

我个人觉得.NET中的十进制情况非常令人失望,并且根据IEE754标准会喜欢Decimal32,Decimal64和Decimal128 - 在SQL Server中也是如此。

然而,我想要的是什么以及它有什么两件事,我不负责这些部分,也不能做出这些改变。一个更统一,更灵活的系统 - 根据IEE标准,最重要的是,它会很棒。

答案 1 :(得分:0)

或者可以使用

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
}
}