在C#中设置十进制数的精度

Dev*_*vid 12 c# decimal

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

在TypeScript中,我使用的是Decimal.js框架,我可以像这样全局更改Decimal操作的精度Decimal.set({ precision: 15}).这意味着该操作将返回最多15位小数.

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

C#中的Decimal值是否有类似的设置?我怎样才能在C#中实现这一目标?

Jac*_*nes 13

这不是您要求的,但您可以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
Run Code Online (Sandbox Code Playgroud)

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

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


luc*_*cky 6

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

var decimalValue = 5m/3m;
var str = decimalValue.ToString("0.##############");//1.66666666666667
Run Code Online (Sandbox Code Playgroud)

或者你可以使用Round;

var decimalValue = 5m/3m;
decimalValue = decimal.Round(decimalValue, 6, MidpointRounding.AwayFromZero);
Run Code Online (Sandbox Code Playgroud)


InB*_*een 6

Decimal.js状态文件如下:

精确

操作结果的最大有效位数.

返回Decimal的所有函数都会将返回值舍入为精确有效数字,除了Decimal,absoluteValue,ceil,floor,negated,round,toDecimalPlaces,toNearest和truncated.

好吧,如果你真的需要全局的那种行为,那么只需实现一个包装类型就可以了,你有一个很好的规范:

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.
}
Run Code Online (Sandbox Code Playgroud)

性能方面这不会令人印象深刻,但如果你需要的行为,那么,无论如何,实现它!

免责声明:在我的手机上编写代码,因此它必然会有错误......简单地试图让这个想法得到解决.

  • 你一定有一个相当大的手机......或微型USB键盘......这种格式比我在电脑上看到的一些格式要好。做得好。 (4认同)