Amy*_*y B 63 .net precision decimal
C#中的这些行
decimal a = 2m;
decimal b = 2.0m;
decimal c = 2.00000000m;
decimal d = 2.000000000000000000000000000m;
Console.WriteLine(a);
Console.WriteLine(b);
Console.WriteLine(c);
Console.WriteLine(d);
Run Code Online (Sandbox Code Playgroud)
生成此输出:
2
2.0
2.00000000
2.000000000000000000000000000
Run Code Online (Sandbox Code Playgroud)
所以我可以看到从文字中创建一个十进制变量允许我控制精度.
And*_*are 18
您只是看到完全相同数据的不同表示.a的精度decimal将缩放到需要的大小(在合理范围内).
十进制数是一个浮点值,由一个符号,一个数值组成,其中值中的每个数字范围从0到9,以及一个缩放系数,表示浮动小数点的位置,用于分隔积分和小数部分的数值.
Decimal值的二进制表示由1位符号,96位整数和用于划分96位整数的比例因子组成,并指定它的小数部分.缩放因子隐式为数字10,上升到指数范围从0到28.因此,十进制值的二进制表示形式为((-2 96到2 96)/ 10 (0到28)) ,其中-2 96 -1等于MinValue,2 96 -1等于MaxValue.
缩放因子还保留十进制数中的任何尾随零.尾随零不影响算术或比较运算中的十进制数的值.但是,如果应用了适当的格式字符串,则ToString方法可以显示尾随零.
我发现我可以通过乘以或除以花哨1来"篡改"刻度.
decimal a = 2m;
decimal c = 2.00000000m;
decimal PreciseOne = 1.000000000000000000000000000000m;
//add maximum trailing zeros to a
decimal x = a * PreciseOne;
//remove all trailing zeros from c
decimal y = c / PreciseOne;
Run Code Online (Sandbox Code Playgroud)
我可以制作足够精确的1来改变已知尺寸的比例因子.
decimal scaleFactorBase = 1.0m;
decimal scaleFactor = 1m;
int scaleFactorSize = 3;
for (int i = 0; i < scaleFactorSize; i++)
{
scaleFactor *= scaleFactorBase;
}
decimal z = a * scaleFactor;
Run Code Online (Sandbox Code Playgroud)
decimal在SQL Server和decimal.NET中混淆是很诱人的; 他们是完全不同的.
SQL Server decimal是一个定点数,在定义列或变量时,其精度和比例是固定的.
.NET decimal是一个像float和的浮点数double(不同之处在于decimal准确保留十进制数字,float而且double准确地保留二进制数字).试图控制.NET的精度decimal是没有意义的,因为无论是否存在填充零,所有计算都将产生相同的结果.
| 归档时间: |
|
| 查看次数: |
57577 次 |
| 最近记录: |