本文整理汇总了C#中System.Data.SqlTypes.SqlDecimal.FZero方法的典型用法代码示例。如果您正苦于以下问题:C# SqlDecimal.FZero方法的具体用法?C# SqlDecimal.FZero怎么用?C# SqlDecimal.FZero使用的例子?那么恭喜您, 这里精选的方法代码示例或许可以为您提供帮助。您也可以进一步了解该方法所在类System.Data.SqlTypes.SqlDecimal
的用法示例。
在下文中一共展示了SqlDecimal.FZero方法的9个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的C#代码示例。
示例1: Round
private static SqlDecimal Round(SqlDecimal n, int lPosition, bool fTruncate)
{
if (n.IsNull)
return SqlDecimal.Null;
if (lPosition >= 0)
{
//If round to the right of decimal number
lPosition = Math.Min(s_NUMERIC_MAX_PRECISION, lPosition);
if (lPosition >= n.m_bScale)
return n; //No need to round
}
else
{
//If round to the left of the decimal point
lPosition = Math.Max(-s_NUMERIC_MAX_PRECISION, lPosition);
//Return +0.00 if truncation of integer part
if (lPosition < n.m_bScale - n.m_bPrec)
{
n.SetToZero();
return n;
}
}
uint ulRem = 0; // Remainder: the highest significant digit to be truncated
int lAdjust = Math.Abs(lPosition - (int)n.m_bScale); // Precision adjustment
uint ulLastDivBase = 1; //
//Compute the integral part of the numeric
while (lAdjust > 0)
{
if (lAdjust >= 9)
{
ulRem = n.DivByULong(s_rgulShiftBase[8]);
ulLastDivBase = s_rgulShiftBase[8];
lAdjust -= 9;
}
else
{
ulRem = n.DivByULong(s_rgulShiftBase[lAdjust - 1]);
ulLastDivBase = s_rgulShiftBase[lAdjust - 1];
lAdjust = 0;
}
}
// The rounding only depends on the first digit after the rounding position
if (ulLastDivBase > 1)
{
ulRem /= (ulLastDivBase / 10);
}
//If result is zero, return
if (n.FZero() && (fTruncate || ulRem < 5))
{
n.SetPositive();
n.AssertValid();
return n;
}
// Adjust by adding 1 if remainder is larger than 5
if (ulRem >= 5 && !fTruncate)
n.AddULong(1);
// Convert back to original scale
lAdjust = Math.Abs(lPosition - n.m_bScale);
while (lAdjust-- > 0)
{
n.MultByULong(s_ulBase10);
}
n.AssertValid();
return n;
}
示例2: dividend
//-----------------------------------------------------------
//DivNm():
// Divide numeric by numeric.
// The Quotient will be returned in *this
//
//Result scale & precision:
// NOTE: same as in Hydra but different from SQL Server Manual,
// where scale = max(s1+p2-s2+1,x_cNumeDivScaleMin)):
// scale = max(s1 + p2 + 1, x_cNumeDivScaleMin);
// precision = max(s1 + p2 + 1, x_cNumeDivScaleMin) + p1 + p2 + 1;
//
//Overflow Rules:
// If scale is greater than NUMERIC_MAX_PRECISION it is set to
// NUMERIC_MAX_PRECISION. If precision is greater than NUMERIC_MAX_PRECISION
// it's set to NUMERIC_MAX_PRECISION, then scale is reduced to keep the
// integer part untruncated but keeping a minimum value of x_cNumeDivScaleMin.
// For example, if using the above formula, the resulting precision is 46 and
// scale is 10, the precision will be reduced to 38, to keep the integral part
// untruncated the scale needs be reduced to 2, but since x_cNumeDivScaleMin
// is set to 6 currently, resulting scale will be 6.
// OverflowException is thrown only if the actual precision is greater than
// NUMERIC_MAX_PRECISION or actual length is greater than x_cbNumeBuf
//
//Algorithm
// Call general purpose arbitrary precision division routine with scale = 0.
// Scale,prec adjusted later.
//
/// <devdoc>
/// <para>[To be supplied.]</para>
/// </devdoc>
public static SqlDecimal operator /(SqlDecimal x, SqlDecimal y)
{
if (x.IsNull || y.IsNull)
return Null;
x.AssertValid();
y.AssertValid();
// Variables for figuring prec,scale
int bScaleD; // Input Scale of dividend (output scale of remainder)
int bPrecD; // Input Prec of dividend (output prec of remainder)
int ResScale; // Final scale we will force quotient to
int ResPrec; // Final precision we will force quotient to
int ResInteger; // # of digits in integer part of result (prec-scale)
int MinScale; // Temp to help compute ResScale
int lScaleAdjust; // How much result scale will be adjusted
bool fResSignPos; // sign of result
// Steps:
// 1) Figure result prec,scale; adjust scale of dividend
// 2) Compute result remainder/quotient in 0 scale numbers
// 3) Set result prec,scale and adjust as necessary
// 0) Check for Div by 0
if (y.FZero())
throw new DivideByZeroException(SQLResource.DivideByZeroMessage);
// 1) Figure out result prec,scale,sign..
fResSignPos = (x.IsPositive == y.IsPositive);//sign of result
//scale = max(s1 + p2 + 1, x_cNumeDivScaleMin);
//precision = max(s1 + p2 + 1, x_cNumeDivScaleMin) + p1 + p2 + 1;
//For backward compatibility, use exactly the same scheme as in Hydra
bScaleD = x.m_bScale;
bPrecD = x.m_bPrec;
ResScale = Math.Max(x.m_bScale + y.m_bPrec + 1, s_cNumeDivScaleMin);
ResInteger = x.m_bPrec - x.m_bScale + y.m_bScale;
MinScale = Math.Min(ResScale, s_cNumeDivScaleMin);
ResInteger = Math.Min(ResInteger, s_NUMERIC_MAX_PRECISION);
ResPrec = ResInteger + ResScale;
if (ResPrec > s_NUMERIC_MAX_PRECISION)
ResPrec = s_NUMERIC_MAX_PRECISION;
// If overflow, reduce the scale to avoid truncation of data
ResScale = Math.Min((ResPrec - ResInteger), ResScale);
ResScale = Math.Max(ResScale, MinScale);
//Adjust the scale of the dividend
lScaleAdjust = ResScale - (int)x.m_bScale + (int)y.m_bScale;
x.AdjustScale(lScaleAdjust, true);
// Step2: Actual Computation
uint[] rgulData1 = new uint[4] { x.m_data1, x.m_data2, x.m_data3, x.m_data4 };
uint[] rgulData2 = new uint[4] { y.m_data1, y.m_data2, y.m_data3, y.m_data4 };
// Buffers for arbitrary precision divide
uint[] rgulR = new uint[s_cNumeMax + 1];
uint[] rgulQ = new uint[s_cNumeMax];
// # of ULONGs in result
int culQ, culR;
// Divide mantissas. V is not zero - already checked.
// Cannot overflow, as Q <= U, R <= V. (and both are positive)
MpDiv(rgulData1, x.m_bLen, rgulData2, y.m_bLen, rgulQ, out culQ, rgulR, out culR);
// Construct the result from Q
ZeroToMaxLen(rgulQ, culQ);
//.........这里部分代码省略.........
示例3: Floor
// Floor - next largest integer smaller or equal to the numeric
/// <devdoc>
/// <para>[To be supplied.]</para>
/// </devdoc>
public static SqlDecimal Floor(SqlDecimal n)
{
n.AssertValid();
if (n.IsNull)
return SqlDecimal.Null;
if (n.m_bScale == 0)
return n;
bool fFraction; //Fractional flag
n.MakeInteger(out fFraction);
//When the numeric has fraction and is negative, subtract 1 by calling AddULong(1)
//Otherwise return the integral part.
if (fFraction && !n.IsPositive)
{
n.AddULong(1);
}
if (n.FZero())//if result is zero, sign should be positive
n.SetPositive();
n.AssertValid();
return n;
}
示例4: OverflowException
//.........这里部分代码省略.........
// When sign of first operand is negative
// negate all operands including result.
if (!fMySignPos)
{
fMySignPos = !fMySignPos;
fOpSignPos = !fOpSignPos;
fResSignPos = !fResSignPos;
}
// Initialize operand lengths and pointer.
culOp1 = x.m_bLen;
culOp2 = y.m_bLen;
uint[] rglData1 = new uint[4] { x.m_data1, x.m_data2, x.m_data3, x.m_data4 };
uint[] rglData2 = new uint[4] { y.m_data1, y.m_data2, y.m_data3, y.m_data4 };
if (fOpSignPos)
{
dwlAccum = 0;
// CONSIDER: Call AddUlong when possible
// Loop through UI4s adding operands and putting result in *this
// of the operands and put result in *this
for (iulData = 0; iulData < culOp1 || iulData < culOp2; iulData++)
{
// None of these DWORDLONG additions can overflow, as dwlAccum comes in < x_lInt32Base
if (iulData < culOp1)
dwlAccum += rglData1[iulData];
if (iulData < culOp2)
dwlAccum += rglData2[iulData];
rglData1[iulData] = (uint)dwlAccum; // equiv to mod x_lInt32Base
dwlAccum >>= 32; // equiv to div x_lInt32Base
}
//If carry
if (dwlAccum != 0)
{
Debug.Assert(dwlAccum < s_ulInt32Base);
//Either overflowed
if (iulData == s_cNumeMax)
throw new OverflowException(SQLResource.ArithOverflowMessage);
// Or extended length
rglData1[iulData] = (uint)dwlAccum;
iulData++;
}
// Set result length
bLen = (byte)iulData;
}
else
{
int iulLastNonZero = 0; // The last nonzero UI
// When second operand is negative, switch operands
// if operand2 is greater than operand1
if (x.LAbsCmp(y) < 0)
{
fResSignPos = !fResSignPos;
uint[] rguiTemp = rglData2;
rglData2 = rglData1;
rglData1 = rguiTemp;
culOp1 = culOp2;
culOp2 = x.m_bLen;
}
dwlAccum = s_ulInt32Base;
for (iulData = 0; iulData < culOp1 || iulData < culOp2; iulData++)
{
if (iulData < culOp1)
dwlAccum += rglData1[iulData];
if (iulData < culOp2)
dwlAccum -= rglData2[iulData];
rglData1[iulData] = (uint)dwlAccum; // equiv to mod BaseUI4
if (rglData1[iulData] != 0)
iulLastNonZero = iulData;
dwlAccum >>= 32; // equiv to /= BaseUI4
dwlAccum += s_ulInt32BaseForMod; // equiv to BaseUI4 - 1
}
// Set length based on highest non-zero ULONG
bLen = (byte)(iulLastNonZero + 1);
}
SqlDecimal ret = new SqlDecimal(rglData1, bLen, (byte)ResPrec, (byte)ResScale, fResSignPos);
if (ret.FGt10_38() || ret.CalculatePrecision() > s_NUMERIC_MAX_PRECISION)
throw new OverflowException(SQLResource.ArithOverflowMessage);
if (ret.FZero())
ret.SetPositive();
ret.AssertValid();
return ret;
}
示例5: result
//.........这里部分代码省略.........
// Calculate actual result length
culRes = idRes + 1;
// III) Adjust precision,scale to result prec,scale
if (lScaleAdjust != 0)
{
// If need to decrease scale
if (lScaleAdjust < 0)
{
Debug.Assert(s_NUMERIC_MAX_PRECISION == ResPrec);
// have to adjust - might yet end up fitting.
// Cannot call AdjustScale - number cannot fit in a numeric, so
// have to duplicate code here
uint ulRem; //Remainder when downshifting
uint ulShiftBase; //What to multiply by to effect scale adjust
do
{
if (lScaleAdjust <= -9)
{
ulShiftBase = s_rgulShiftBase[8];
lScaleAdjust += 9;
}
else
{
ulShiftBase = s_rgulShiftBase[-lScaleAdjust - 1];
lScaleAdjust = 0;
}
MpDiv1(rgulRes, ref culRes, ulShiftBase, out ulRem);
}
while (lScaleAdjust != 0);
// Still do not fit?
if (culRes > s_cNumeMax)
throw new OverflowException(SQLResource.ArithOverflowMessage);
for (idRes = culRes; idRes < s_cNumeMax; idRes++)
rgulRes[idRes] = 0;
ret = new SqlDecimal(rgulRes, (byte)culRes, (byte)ResPrec, (byte)ResScale, fResPositive);
// Is it greater than 10**38?
if (ret.FGt10_38())
throw new OverflowException(SQLResource.ArithOverflowMessage);
ret.AssertValid();
// If remainder is 5 or above, increment/decrement by 1.
if (ulRem >= ulShiftBase / 2)
ret.AddULong(1);
// After adjusting, if the result is 0 and remainder is less than 5,
// set the sign to be positive
if (ret.FZero())
ret.SetPositive();
return ret;
}
// Otherwise call AdjustScale
if (culRes > s_cNumeMax) // Do not fit now, so will not fit after adjustment
throw new OverflowException(SQLResource.ArithOverflowMessage);
// NOTE: Have not check for value in the range (10**38..2**128),
// as we'll call AdjustScale with positive argument, and it'll
// return "normal" overflow
for (idRes = culRes; idRes < s_cNumeMax; idRes++)
rgulRes[idRes] = 0;
ret = new SqlDecimal(rgulRes, (byte)culRes, (byte)ResPrec, (byte)ActualScale, fResPositive);
if (ret.FZero())
ret.SetPositive();
ret.AssertValid();
ret.AdjustScale(lScaleAdjust, true);
return ret;
}
else
{
if (culRes > s_cNumeMax)
throw new OverflowException(SQLResource.ArithOverflowMessage);
for (idRes = culRes; idRes < s_cNumeMax; idRes++)
rgulRes[idRes] = 0;
ret = new SqlDecimal(rgulRes, (byte)culRes, (byte)ResPrec, (byte)ResScale, fResPositive);
// Is it greater than 10**38?
if (ret.FGt10_38())
throw new OverflowException(SQLResource.ArithOverflowMessage);
if (ret.FZero())
ret.SetPositive();
ret.AssertValid();
return ret;
}
}
示例6: while
public static SqlDecimal operator *(SqlDecimal x, SqlDecimal y)
{
SqlDecimal num11;
if (x.IsNull || y.IsNull)
{
return Null;
}
int bLen = y.m_bLen;
int num10 = x.m_bScale + y.m_bScale;
int num3 = num10;
int num13 = ((x.m_bPrec - x.m_bScale) + (y.m_bPrec - y.m_bScale)) + 1;
int num6 = num3 + num13;
if (num6 > NUMERIC_MAX_PRECISION)
{
num6 = NUMERIC_MAX_PRECISION;
}
if (num3 > NUMERIC_MAX_PRECISION)
{
num3 = NUMERIC_MAX_PRECISION;
}
num3 = Math.Max(Math.Min(num6 - num13, num3), Math.Min(num10, x_cNumeDivScaleMin));
int digits = num3 - num10;
bool fPositive = x.IsPositive == y.IsPositive;
uint[] numArray5 = new uint[] { x.m_data1, x.m_data2, x.m_data3, x.m_data4 };
uint[] numArray4 = new uint[] { y.m_data1, y.m_data2, y.m_data3, y.m_data4 };
uint[] rgulU = new uint[9];
int index = 0;
for (int i = 0; i < x.m_bLen; i++)
{
uint num16 = numArray5[i];
ulong num2 = 0L;
index = i;
for (int j = 0; j < bLen; j++)
{
ulong num7 = num2 + rgulU[index];
ulong num15 = numArray4[j];
num2 = num16 * num15;
num2 += num7;
if (num2 < num7)
{
num7 = x_ulInt32Base;
}
else
{
num7 = 0L;
}
rgulU[index++] = (uint) num2;
num2 = (num2 >> 0x20) + num7;
}
if (num2 != 0L)
{
rgulU[index++] = (uint) num2;
}
}
while ((rgulU[index] == 0) && (index > 0))
{
index--;
}
int ciulU = index + 1;
if (digits != 0)
{
if (digits < 0)
{
uint num12;
uint num14;
do
{
if (digits <= -9)
{
num12 = x_rgulShiftBase[8];
digits += 9;
}
else
{
num12 = x_rgulShiftBase[-digits - 1];
digits = 0;
}
MpDiv1(rgulU, ref ciulU, num12, out num14);
}
while (digits != 0);
if (ciulU > x_cNumeMax)
{
throw new OverflowException(SQLResource.ArithOverflowMessage);
}
for (index = ciulU; index < x_cNumeMax; index++)
{
rgulU[index] = 0;
}
num11 = new SqlDecimal(rgulU, (byte) ciulU, (byte) num6, (byte) num3, fPositive);
if (num11.FGt10_38())
{
throw new OverflowException(SQLResource.ArithOverflowMessage);
}
if (num14 >= (num12 / 2))
{
num11.AddULong(1);
}
if (num11.FZero())
{
num11.SetPositive();
//.........这里部分代码省略.........
示例7: Round
private static SqlDecimal Round(SqlDecimal n, int lPosition, bool fTruncate)
{
if (n.IsNull)
{
return Null;
}
if (lPosition >= 0)
{
lPosition = Math.Min(NUMERIC_MAX_PRECISION, lPosition);
if (lPosition >= n.m_bScale)
{
return n;
}
}
else
{
lPosition = Math.Max(-NUMERIC_MAX_PRECISION, lPosition);
if (lPosition < (n.m_bScale - n.m_bPrec))
{
n.SetToZero();
return n;
}
}
uint num2 = 0;
int num = Math.Abs((int) (lPosition - n.m_bScale));
uint num3 = 1;
while (num > 0)
{
if (num >= 9)
{
num2 = n.DivByULong(x_rgulShiftBase[8]);
num3 = x_rgulShiftBase[8];
num -= 9;
}
else
{
num2 = n.DivByULong(x_rgulShiftBase[num - 1]);
num3 = x_rgulShiftBase[num - 1];
num = 0;
}
}
if (num3 > 1)
{
num2 /= num3 / 10;
}
if (n.FZero() && (fTruncate || (num2 < 5)))
{
n.SetPositive();
return n;
}
if ((num2 >= 5) && !fTruncate)
{
n.AddULong(1);
}
num = Math.Abs((int) (lPosition - n.m_bScale));
while (num-- > 0)
{
n.MultByULong(x_ulBase10);
}
return n;
}
示例8: Floor
public static SqlDecimal Floor(SqlDecimal n)
{
if (n.IsNull)
{
return Null;
}
if (n.m_bScale != 0)
{
bool flag;
n.MakeInteger(out flag);
if (flag && !n.IsPositive)
{
n.AddULong(1);
}
if (n.FZero())
{
n.SetPositive();
}
}
return n;
}
示例9: DivideByZeroException
public static SqlDecimal operator /(SqlDecimal x, SqlDecimal y)
{
int num4;
int num8;
if (x.IsNull || y.IsNull)
{
return Null;
}
if (y.FZero())
{
throw new DivideByZeroException(SQLResource.DivideByZeroMessage);
}
bool fPositive = x.IsPositive == y.IsPositive;
int num = Math.Max((x.m_bScale + y.m_bPrec) + 1, (int) x_cNumeDivScaleMin);
int num3 = (x.m_bPrec - x.m_bScale) + y.m_bScale;
int num2 = ((num + x.m_bPrec) + y.m_bPrec) + 1;
int num7 = Math.Min(num, x_cNumeDivScaleMin);
num3 = Math.Min(num3, NUMERIC_MAX_PRECISION);
num2 = num3 + num;
if (num2 > NUMERIC_MAX_PRECISION)
{
num2 = NUMERIC_MAX_PRECISION;
}
num = Math.Max(Math.Min(num2 - num3, num), num7);
int digits = (num - x.m_bScale) + y.m_bScale;
x.AdjustScale(digits, true);
uint[] rgulU = new uint[] { x.m_data1, x.m_data2, x.m_data3, x.m_data4 };
uint[] rgulD = new uint[] { y.m_data1, y.m_data2, y.m_data3, y.m_data4 };
uint[] rgulR = new uint[x_cNumeMax + 1];
uint[] rgulQ = new uint[x_cNumeMax];
MpDiv(rgulU, x.m_bLen, rgulD, y.m_bLen, rgulQ, out num4, rgulR, out num8);
ZeroToMaxLen(rgulQ, num4);
SqlDecimal num5 = new SqlDecimal(rgulQ, (byte) num4, (byte) num2, (byte) num, fPositive);
if (num5.FZero())
{
num5.SetPositive();
}
return num5;
}