是否可以全局更改C#中十进制数的精度?
在TypeScript中,我使用的是Decimal.js框架,我可以像这样全局更改Decimal操作的精度Decimal.set({ precision: 15}).这意味着该操作将返回最多15位小数.
5/3返回1.666666666666675m/3m返回1.6666666666666666666666666667C#中的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
没有通用的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)
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)
性能方面这不会令人印象深刻,但如果你需要的行为,那么,无论如何,实现它!
免责声明:在我的手机上编写代码,因此它必然会有错误......简单地试图让这个想法得到解决.
| 归档时间: |
|
| 查看次数: |
21276 次 |
| 最近记录: |