繁体   English   中英

在C#中设置小数的精度

[英]Set the precision for Decimal numbers in C#

是否可以全局更改C#中小数的精度?

在TypeScript中,我使用框架Decimal.js ,在其中可以像Decimal.set({ precision: 15})这样全局更改Decimal操作的Decimal.set({ precision: 15}) 这意味着该操作最多返回15个十进制数字。

  • TypeScript :操作5/3返回1.66666666666667
  • C#操作5m/3m返回1.6666666666666666666666666667

C#中的Decimal值是否有一些类似的设置? 如何在C#中完成此操作?

这并不完全是您要的,但是您可以在全局范围内初始化NumberFormatInfo对象,并使用它来格式化小数。 这是一个例子:

NumberFormatInfo setPrecision = new NumberFormatInfo();

setPrecision.NumberDecimalDigits = 2;

decimal test = 1.22223;

Console.Write(test.ToString("N", setPrecision)); //Should write 1.23

setPrecision.NumberDecimalDigits = 3;

test = 5m/3m;

Console.Write(test.ToString("N", setPrecision)); //Should write 1.667

MSDN链接: https : //msdn.microsoft.com/zh-cn/library/system.globalization.numberformatinfo(v=vs.110).aspx

NumberDecimalDigits用法示例: https ://msdn.microsoft.com/zh-cn/library/system.globalization.numberformatinfo.numberdecimaldigits( v= vs.110).aspx

没有decimal精度的通用设置。 您最好的机会是在扩展中实现这些方法。

var decimalValue = 5m/3m;
var str = decimalValue.ToString("0.##############");//1.66666666666667

或者您可以使用Round ;

var decimalValue = 5m/3m;
decimalValue = decimal.Round(decimalValue, 6, MidpointRounding.AwayFromZero);

Decimal.js的文档规定以下内容:

精确

运算结果的最大有效位数。

所有返回Decimal的函数都会将返回值四舍五入为有效的有效数字,但Decimal,absoluteValue,ceil,floor,negated,round,toDecimalPlaces,toNearest和截断的除外。

好吧,如果您确实需要全局的行为,那么只需实现一个实现该目的的包装器类型,就可以遵循以下规范:

public struct RoundedDecimal
{
    public static int Precision { get; private set; }

    public static Decimal AbsoluteValue(
        RoundedDecimal d) => Math.Abs(d.value);

    //same with ceiling, floor, etc.

    private readonly decimal value;

    public RoundedDecimal(decimal d)
    {
        value = Decimal.Round(d, Precision);
    }

    public static void SetPrecision(int precision)
    {
        Precision = precision; /*omitted argument validation*/ }

     public static implicit operator Decimal(
         RoundedDecimal d) => d.value;

    public static explicit operator RoundedDecimal(
        decimal d) => new RoundedDecimal(d);

    public static RoundedDecimal operator +(
        RoundedDecimal left, RoundedDecimal right) =>
           new RoundedDecimal(left.value + right.value);

    //etc.
}

在性能方面,这不会给人留下深刻的印象,但是如果您需要它的行为,则一定要实施!

免责声明:在我的手机上编写了代码,因此它肯定有错误。

暂无
暂无

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

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