/// <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)); }
/// <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)); }
/// <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); }
/// <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)); }
/// <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); }
/// <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); }