如何最有效地缩放和设置十进制精度

How is most performant way to scale and set precision of decimal

提问人:Dilshod K 提问时间:2/17/2022 最后编辑:marc_sDilshod K 更新时间:5/5/2023 访问量:693

问:

我有一个设置比例和精度的类:

public class MyDecimalConverter
{
    public int Scale { get; }
    public int Precision { get; }

    public MyDecimalConverter(int scale, int precision)
    {
        Scale = scale;
        Precision = precision;
    }

    public decimal ConvertDecimal(decimal decimalValue)
    {
        return  //Calculated value
    }
} 

此外,它还有方法。我想根据比例和精度计算提供的十进制值。例如,当ConvertDecimal

  • 精度 = 5

  • 比例 = 4

  • 提供的十进制值 = ,123456789

  • 该方法应返回1,2345

下面是关于什么是比例和什么是精度的屏幕截图:

scale

我在数学课上没有找到这种功能。所以我想知道一种正确且高性能的方法来制作这种功能

C# 十进制 小数位数 精度

评论

0赞 haldo 2/17/2022
你已经指定了,那么为什么输出不是?输出会有什么用?scale = 412345.6789precision=5; scale=0;
0赞 Dilshod K 2/17/2022
@haldo 它不能是 12345.6789,因为精度为 5,因此十进制输出的长度不能大于精度。如果精度 = 5 且小数位数 =0,则为 12345
1赞 Jeroen Mostert 2/17/2022
如果你这样做是为了满足数据库的约束,并且该数据库是 SQL Server(术语“精度”和“规模”让我想到),请看一下结构,它正是针对这种情况的。SqlDecimalAdjustScale

答:

1赞 Tomov Nenad 5/5/2023 #1

我发现您可以同时设置精度和比例的唯一方法是:

public static decimal SetPrecisionAndScale(this decimal number, int precision, int scale)
{
    System.Data.SqlTypes.SqlDecimal x;
    x = new System.Data.SqlTypes.SqlDecimal(number);
    var convertedNumber = System.Data.SqlTypes.SqlDecimal.ConvertToPrecScale(x, precision, scale);
    return convertedNumber.Value;
}

我不确定性能是否苛刻,但我在生产中使用此代码并且运行良好(没有打嗝、内存泄漏或性能瓶颈)。