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

时间:2018-01-11 16:56:11

标签: c# decimal

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

在TypeScript中,我使用的是框架state the new URL scheme explicitly,我可以像Decimal.set({ precision: 15})一样全局更改Decimal操作的精度。这意味着该操作将返回最多15位十进制数字。

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

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

3 个答案:

答案 0 :(得分:9)

这不是您要求的,但您可以在全局范围内初始化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/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

答案 1 :(得分:6)

Decimal.js的文档说明如下:

  

<强>精度

     

最大结果的有效数字   操作

     

所有返回Decimal的函数都会将返回值舍入为   精度有效数字除了Decimal,absoluteValue,ceil,   floor,negated,round,toDecimalPlaces,toNearest and 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.
}

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

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

答案 2 :(得分:3)

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

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

或者您可以使用Round;

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