繁体   English   中英

我需要在结构C#中使用字段初始化的替代方法(结构中不能包含实例字段初始化器)

[英]I need a alternative to using a field initialize in a struct C# (Cannot have instance field initializers in structs)

基本上,我理解为什么我在这里遇到错误,但是,我不确定要怎么做,这是我的代码:

public struct CashAmount
{
    public int leftNumberExact, decimalNumberExact;

    public string CashAmountExact = leftNumberExact + "." + decimalNumberExact;

    public float CashAmountApprox = float.Parese(CashAmountExact);
}

基本上,我试图使数据类型具有像int一样精确的精度,但也具有小数。 无论我为什么不使用ulong或double或某种其他形式的浮点精度,它都必须绝对精确。

此代码应执行您想要的操作。 您仍然需要初始化'leftNumberExact''decimalNumberExact' ,但其他属性将'decimalNumberExact'

public struct CashAmount
{
    public int leftNumberExact, decimalNumberExact;

    public string CashAmountExact
    {
         get:
         {
             return leftNumberExact + "." + decimalNumberExact;
         }
    }

    public decimal CashAmountApprox
    {
        get:
        {
            return decimal.Parse(CashAmountExact);
        }
    }
}

如您所见,我仅使用getter将字段设置为属性。

我还更改为'decimal'类型,应该完全准确。

如果约束实际上是“无论如何都必须绝对精确”,那么您应该使用强制执行这些约束的东西,例如github上的peteroupc的Numbers库。

请参阅EDecimal类该类强制执行此除法规则:

如果结果不准确,则返回NaN,因为该结果将具有无终止的十进制扩展。

例如,这意味着1/3 == NaN:

EDecimal.One.Divide(3) == NaN

总的来说,我认为这是过于严格的限制,您最好使用一个理智而直观的库,例如GMPLib的包装器(GNU多精度库),或者使用许多其他可用的库: 两个

如果您打算自己实现某些功能,那么至少要签出其他库,因为最终会得到类似于或基于BigInteger的功能

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM