是否可以在C#中全局更改十进制数字的精度?
在TypeScript中,我使用的是框架state the new URL scheme explicitly,我可以像Decimal.set({ precision: 15})
一样全局更改Decimal操作的精度。这意味着该操作将返回最多15位十进制数字。
5/3
返回1.66666666666667
5m/3m
返回1.6666666666666666666666666667
C#中的Decimal值是否有类似的设置?我怎样才能在C#中实现这个目标?
答案 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);