/// <summary>
 /// Rounds to decimal places.
 /// </summary>
 /// <seealso cref="Numbers.RoundToDecimalPlaces">https://en.wikipedia.org/wiki/Significant_figures</seealso>
 /// <param name="value">The value.</param>
 /// <param name="decimalPlaces">The number of decimal places.</param>
 /// <param name="roundingTieBreaker">Method by which rounding is performed if the triggering rounding number is 5.</param>
 /// <returns>System.Double.</returns>
 public static string DisplayRoundedToDecimalPlaces(
     this double value,
     int decimalPlaces,
     RoundingTieBreaker roundingTieBreaker = RoundingTieBreaker.HalfAwayFromZero)
 {
     return(Numbers.DisplayRoundedToDecimalPlaces(value, decimalPlaces, roundingTieBreaker));
 }
Esempio n. 2
0
 /// <summary>
 /// Rounds to decimal places.
 /// </summary>
 /// <seealso cref="RoundToDecimalPlaces">https://en.wikipedia.org/wiki/Significant_figures</seealso>
 /// <param name="value">The value.</param>
 /// <param name="decimalPlaces">The number of decimal places.</param>
 /// <param name="roundingTieBreaker">Method by which rounding is performed if the triggering rounding number is 5.</param>
 /// <returns>System.Double.</returns>
 public static double RoundToDecimalPlaces(
     double value,
     int decimalPlaces,
     RoundingTieBreaker roundingTieBreaker = RoundingTieBreaker.HalfAwayFromZero)
 {
     return(NMath.Round(value, decimalPlaces, midpointRounding(roundingTieBreaker)));
 }
 /// <summary>
 /// Rounds to significant figures.
 /// </summary>
 /// <seealso cref="Numbers.RoundToSignificantFigures">https://en.wikipedia.org/wiki/Significant_figures</seealso>
 /// <param name="value">The value.</param>
 /// <param name="significantFigures">The number of significant figures.</param>
 /// <param name="roundingTieBreaker">Method by which rounding is performed if the triggering rounding number is 5.</param>
 /// <returns>System.Double.</returns>
 public static string DisplayRoundedToSignificantFigures(
     this double value,
     int significantFigures,
     RoundingTieBreaker roundingTieBreaker = RoundingTieBreaker.HalfAwayFromZero)
 {
     return(Numbers.DisplayRoundedToSignificantFigures(value, significantFigures, roundingTieBreaker));
 }
Esempio n. 4
0
        /// <summary>
        /// Rounds to decimal places.
        /// </summary>
        /// <seealso cref="RoundToDecimalPlaces">https://en.wikipedia.org/wiki/Significant_figures</seealso>
        /// <param name="value">The value.</param>
        /// <param name="decimalPlaces">The number of decimal places.</param>
        /// <param name="roundingTieBreaker">Method by which rounding is performed if the triggering rounding number is 5.</param>
        /// <returns>System.Double.</returns>
        public static string DisplayRoundedToDecimalPlaces(
            double value,
            int decimalPlaces,
            RoundingTieBreaker roundingTieBreaker = RoundingTieBreaker.HalfAwayFromZero)
        {
            value = RoundToDecimalPlaces(value, decimalPlaces, roundingTieBreaker);
            string valueAsString = value.ToString(CultureInfo.InvariantCulture);

            if (decimalPlaces <= 0)
            {
                return(valueAsString);
            }

            // Get number of decimal places
            int    prePaddingLength = valueAsString.Length;
            string wholeNumber;
            string decimalNumber      = "";
            int    valueDecimalLength = valueAsString.Length;

            if (valueAsString.Contains(CultureInfo.InvariantCulture.NumberFormat.NumberDecimalSeparator))
            {
                wholeNumber         = valueAsString.Split(CultureInfo.InvariantCulture.NumberFormat.NumberDecimalSeparator)[0];
                decimalNumber       = valueAsString.Split(CultureInfo.InvariantCulture.NumberFormat.NumberDecimalSeparator)[1];
                valueDecimalLength -= (wholeNumber.Length + 1);
            }
            else
            {
                wholeNumber        = valueAsString;
                valueDecimalLength = 0;

                if (wholeNumber[0] == '0')
                {
                    prePaddingLength += 1;
                }
            }

            string result      = wholeNumber + CultureInfo.InvariantCulture.NumberFormat.NumberDecimalSeparator + decimalNumber;
            int    zeroPadding = decimalPlaces - valueDecimalLength;

            result = result.PadRight(prePaddingLength + zeroPadding, '0');
            return(result);
        }
Esempio n. 5
0
        /// <summary>
        /// Rounds to significant figures.
        /// </summary>
        /// <seealso cref="RoundToSignificantFigures">https://en.wikipedia.org/wiki/Significant_figures</seealso>
        /// <param name="value">The value.</param>
        /// <param name="significantFigures">The number of significant figures.</param>
        /// <param name="roundingTieBreaker">Method by which rounding is performed if the triggering rounding number is 5.</param>
        /// <returns>System.Double.</returns>
        public static double RoundToSignificantFigures(
            double value,
            int significantFigures,
            RoundingTieBreaker roundingTieBreaker = RoundingTieBreaker.HalfAwayFromZero)
        {
            if (value == 0 || significantFigures == 0)
            {
                return(0);
            }

            // Get value scaled to having sig figs result as an integer e.g. 4th sig fig 12345 = 1234.5 or 0.00012345 = 1234.5, 7th sig fig 12.345 = 1234500
            double scale      = NMath.Pow(10, NMath.Floor(NMath.Log10(NMath.Abs(value))) + 1 - significantFigures);
            double valueScale = value / scale;

            // Round in case floating point affects number outside of precision (e.g. for 0.545 vs. 0.5449999999 for rounding to 0.6)
            double valueScaleRounded = NMath.Round(valueScale, 2);

            // scale back up
            return(scale * NMath.Round(valueScaleRounded, midpointRounding(roundingTieBreaker)));
        }
 /// <summary>
 /// Rounds to significant figures.
 /// </summary>
 /// <seealso cref="Numbers.RoundToSignificantFigures">https://en.wikipedia.org/wiki/Significant_figures</seealso>
 /// <param name="value">The value.</param>
 /// <param name="significantFigures">The number of significant figures.</param>
 /// <param name="roundingTieBreaker">Method by which rounding is performed if the triggering rounding number is 5.</param>
 /// <returns>System.Double.</returns>
 public static double RoundToSignificantFigures(this int value, int significantFigures, RoundingTieBreaker roundingTieBreaker = RoundingTieBreaker.HalfAwayFromZero)
 {
     return(Numbers.RoundToSignificantFigures(value, significantFigures, roundingTieBreaker));
 }
Esempio n. 7
0
        /// <summary>
        /// Rounds to significant figures.
        /// </summary>
        /// <seealso cref="RoundToSignificantFigures">https://en.wikipedia.org/wiki/Significant_figures</seealso>
        /// <param name="value">The value.</param>
        /// <param name="significantFigures">The number of significant figures.</param>
        /// <param name="roundingTieBreaker">Method by which rounding is performed if the triggering rounding number is 5.</param>
        /// <returns>System.Double.</returns>
        public static string DisplayRoundedToSignificantFigures(
            double value,
            int significantFigures,
            RoundingTieBreaker roundingTieBreaker = RoundingTieBreaker.HalfAwayFromZero)
        {
            value = RoundToSignificantFigures(value, significantFigures, roundingTieBreaker);
            string valueAsString = value.ToString(CultureInfo.InvariantCulture);

            if (significantFigures <= 0)
            {
                return(valueAsString);
            }

            // Get number of decimal places
            int    prePaddingLength = valueAsString.Length;
            string wholeNumber;
            string decimalNumber = "";
            int    wholeNumberLength;

            if (valueAsString.Contains(CultureInfo.InvariantCulture.NumberFormat.NumberDecimalSeparator))
            {
                wholeNumber       = valueAsString.Split(CultureInfo.InvariantCulture.NumberFormat.NumberDecimalSeparator)[0];
                decimalNumber     = valueAsString.Split(CultureInfo.InvariantCulture.NumberFormat.NumberDecimalSeparator)[1];
                wholeNumberLength = (wholeNumber[0] == '-') ? wholeNumber.Length - 1 : wholeNumber.Length;
            }
            else
            {
                wholeNumber       = valueAsString;
                wholeNumberLength = (wholeNumber[0] == '-') ? wholeNumber.Length - 1 : wholeNumber.Length;

                if (wholeNumber[0] == '0')
                {
                    prePaddingLength += 1;
                }
                else if (significantFigures <= wholeNumberLength)
                {
                    return(valueAsString);
                }
            }
            int  valueSigFigLength;
            char firstInteger = (wholeNumber[0] == '-') ? wholeNumber[1] : wholeNumber[0];

            if (valueAsString.Contains(CultureInfo.InvariantCulture.NumberFormat.NumberDecimalSeparator) && firstInteger != '0')
            {
                valueSigFigLength = (wholeNumber[0] == '-') ? valueAsString.Length - 2 : valueAsString.Length - 1;
            }
            else
            {
                string sigFigAsString = valueAsString.TrimStart('-')
                                        .TrimStart('0')
                                        .Replace(CultureInfo.InvariantCulture.NumberFormat.NumberDecimalSeparator, "")
                                        .TrimStart('0');
                valueSigFigLength = sigFigAsString.Length;
            }
            string separator = ((significantFigures >= wholeNumberLength) || firstInteger == '0') ? CultureInfo.InvariantCulture.NumberFormat.NumberDecimalSeparator : "";

            string result      = wholeNumber + separator + decimalNumber;
            int    zeroPadding = significantFigures - valueSigFigLength;

            result = result.PadRight(prePaddingLength + zeroPadding, '0');
            return(result);
        }
Esempio n. 8
0
 /// <summary>
 /// Returns System.Math enum for the corresponding midpoint rounding method.
 /// </summary>
 /// <param name="roundingTieBreaker">The rounding tie breaker.</param>
 /// <returns>MidpointRounding.</returns>
 private static MidpointRounding midpointRounding(RoundingTieBreaker roundingTieBreaker)
 {
     return((roundingTieBreaker == RoundingTieBreaker.HalfAwayFromZero) ? MidpointRounding.AwayFromZero : MidpointRounding.ToEven);
 }