[英]Set the precision for Decimal numbers in C#
是否可以全局更改C#中小数的精度?
在TypeScript中,我使用框架Decimal.js ,在其中可以像Decimal.set({ precision: 15})
这样全局更改Decimal操作的Decimal.set({ precision: 15})
。 这意味着该操作最多返回15个十进制数字。
5/3
返回1.66666666666667
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.